2016-07-24 102 views
-3

我有動態數組的問題。該代碼不插入也不輸出任何數據。我不知道我犯了什麼錯誤。 函數addEntry和deleteEntry似乎是錯誤的,但我對C++非常缺乏經驗,任何見解都會有所幫助。動態數組輸出C++

#include<iostream> 
#include<string> 
#include<cstdlib> 
using namespace std; 

class DynamicStringArray { 
public: 
    DynamicStringArray(); 
    DynamicStringArray(const DynamicStringArray& dsa); 
    ~DynamicStringArray(); 
    int getSize() const; 
    void addEntry(string element); 
    bool deleteEntry(string element); 
    void operator = (const DynamicStringArray &dsa); 
    string getEntry(int); 
private: 
    int size; 
    string *dynamicArray; 


}; 

DynamicStringArray::DynamicStringArray() 
{ 
    size = 0; 
    dynamicArray = NULL; 
} 



DynamicStringArray::DynamicStringArray(const DynamicStringArray & dsa) 
{ 
    size = dsa.size; 
    string *dynamicArray = dsa.dynamicArray; 
} 


DynamicStringArray::~DynamicStringArray() 
{ 
    delete[] dynamicArray; 
} 


int DynamicStringArray::getSize() const 
{ 
    return size; 

} 

void DynamicStringArray::addEntry(string element) 
{ 
    string *tempArray; 
    tempArray = new string[size + 1]; 
    int i = 0; 
    while (i < size) 
    { 
     tempArray[i] = dynamicArray[i]; 
     tempArray[size + 1] = element; 
     delete[] dynamicArray; 
     string *dynamicArray = new string[size]; 
     dynamicArray[i] = tempArray[i]; 
     delete[] tempArray; 
     i++; 
    }             
} 

bool DynamicStringArray::deleteEntry(string element) 
{ 
    bool check = false;  
    int i = 0; 
    while (i < size) 
    { 
     if (dynamicArray[i] == element) 
      check = true; 
    } 

    if (check == true) 
    { 
     string *pomocniArray = new string[size - 1]; 
     while (i < size) 
     { 
      if (dynamicArray[i] != element) 
       pomocniArray[i] = dynamicArray[i]; 
      size--; 
     } 
     delete[] dynamicArray; 
     string *dynamicArray = new string[size]; 
     for (int i = 0; i < size; i++) 
      dynamicArray[i] = pomocniArray[i]; 
     delete[] pomocniArray; 
     return check; 
    } 
} 


void DynamicStringArray::operator=(const DynamicStringArray & dsa) 
{ 
    size = dsa.size; 
    string *dynamicArray = dsa.dynamicArray; 
} 

string DynamicStringArray::getEntry(int i) 
{ 
    return dynamicArray[i]; 
} 

int main() 
{ 
    DynamicStringArray dsa; 

    dsa.addEntry("Michael"); 
    dsa.addEntry("Rezzy"); 
    dsa.addEntry("John"); 

    system("Pause"); 
    return 0; 

} 
+1

當您使用調試器逐步執行代碼時,您觀察到了什麼? –

+0

問題是我無法輸入數據,他們不讓我去做:( – xerror

+1

@xerror'他們不讓我這麼做' - 他們* *他們* – PaulMcKenzie

回答

-2

千萬不要聽惡意評論,比如「不要做這樣的事情」。做你的事,學習代碼的工作方式,改進它,並使之更好。

這就是說,你的代碼是非常糟糕的開始。這個解決方案的工作原理雖然不完美

如果可以的話,我建議閱讀複製構造函數,或者訪問c++ faq

如果您有任何後續問題,請隨時在評論中提問。

#include <iostream> 
#include <string> 
#include <cstdlib> 

using namespace std; // highly discouraged 

class DynamicStringArray { 
public: 
    DynamicStringArray(); 
    DynamicStringArray(const DynamicStringArray& dsa); 
    ~DynamicStringArray(); 

    int getSize() const; 
    void addEntry(string element); 
    bool deleteEntry(string element); 
    string& getEntry(int); // you should return a reference on these functions if you want to modify whatever is returned 

private: 
    int size; 
    string *dynamicArray; 
}; 

DynamicStringArray::DynamicStringArray() 
{ 
    size = 0; 
    dynamicArray = NULL; // use nullptr if you can use c++11 
} 

DynamicStringArray::DynamicStringArray(const DynamicStringArray & dsa) 
{ 
    size = dsa.size; 
    dynamicArray = new string[size]; 

    // copy all of the old elements 
    for (int iString = 0; iString < size; ++iString) { 
    dynamicArray[iString] = dsa.dynamicArray[iString]; 
    } 
} 


DynamicStringArray::~DynamicStringArray() 
{ 
    delete[] dynamicArray; 
} 


int DynamicStringArray::getSize() const 
{ 
    return size; 
} 

void DynamicStringArray::addEntry(string element) 
{ 
    // make a new array capable of holding size+1 elements 
    string* tempArray = new string[size + 1]; 

    // copy all of the old elements 
    for (int iString = 0; iString < size; ++iString) { 
    tempArray[iString] = dynamicArray[iString]; 
    } 

    // set the last element of the new array 
    tempArray[size] = element; 

    // cleanup arrays 
    if (dynamicArray != NULL) { 
    delete[] dynamicArray; 
    } 
    dynamicArray = tempArray; 
    size += 1; 
} 

bool DynamicStringArray::deleteEntry(string element) 
{ 
    // if array is empty, bail 
    if (dynamicArray == NULL) { 
    return false; 
    } 

    // find index of element requested for delete 
    int stringIndex = -1; 
    for (int iString = 0; iString < size; ++iString) { 
    if (dynamicArray[iString] == element) { 
     stringIndex = iString; 
     break; 
    } 
    } 

    //if element was not found, bail 
    if (stringIndex == -1) { 
    return false; 
    } 

    // prepare the new array 
    size -= 1; 
    string* tempArray = new string[size]; 

    // copy first part (before removed element) to the new array 
    for (int iString = 0; iString < stringIndex; ++iString) { 
    tempArray[iString] = dynamicArray[iString]; 
    } 

    // copy second part (after removed element) to the new array 
    for (int iString = stringIndex; iString < size; ++iString) { 
    tempArray[iString] = dynamicArray[iString + 1]; 
    } 

    // cleanup 
    delete[] dynamicArray; 
    dynamicArray = tempArray; 

    return true; 
} 

string& DynamicStringArray::getEntry(int i) 
{ 
    return dynamicArray[i]; 
} 

int main() 
{ 
    DynamicStringArray dsa; 

    dsa.addEntry("Michael"); 
    dsa.addEntry("Rezzy"); 
    dsa.addEntry("John"); 

    cout << dsa.getEntry(0) << " " << dsa.getEntry(1) << " " << dsa.getEntry(2) << endl; 

    system("Pause"); 
    return 0; 
} 
+0

@Puzmor克羅地亞謝謝soo多兄弟:) – xerror

+0

@PaulMcKenzie 1.從複製粘貼的剩餘。 2.它總是被初始化。 3.從原始問題的複製粘貼中剩餘。 嚴肅地說,這並不是要「看看我的完美代碼,每個人都應該像我一樣編碼」的答案。既然提問者只是一個初學者,他們應該改進自己的代碼,因爲把魚給新手漁夫是不會教他釣魚的。 +您的評論低於任何建設性的禮儀水平。 –

+1

@PuzomorCroatia - 「它總是被初始化」 - 不,它不是。複製構造函數在給定現有對象的情況下構造一個新對象。在完成之前,您正在調用delete [] dynamicArray;',並且'dynamicArray'未初始化,因此您調用了未定義的行爲。這不是發佈「完美代碼」的問題,但是不應該接受像這樣的基本錯誤。 – PaulMcKenzie