2017-08-30 116 views
3
class DSArray { 

private: 
    int size; 
    string *dynamicArray; 

public: 
    DSArray(); 
    DSArray(int size, string []); 
    ~DSArray(); 
    int getSize() const; 
    void addEntry(string newString); 
    bool deleteEntry(string find); 
    string getEntry(const int index) const; 
    void operator = (const DSArray& obj); 
    string operator [] (int index); 
    friend ostream& operator << (ostream &out, const DSArray& array); 


}; 

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

DSArray::DSArray(int size, string []){ 
    dynamicArray = new string[size]; 
    for (int i = 0; i < size; i++){ 
     dynamicArray[i] = getEntry(i); 
    } 
    size = getSize(); 
} 

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

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


void DSArray::addEntry(string newString){ 
    string *tempPtr = dynamicArray; 
    dynamicArray = new string[size + 1]; 
    dynamicArray[size].assign(newString); 
    for(int i = 0; i < size; i++){ 
     dynamicArray[i] = tempPtr[i]; 
    } 
    if(size > 0){ 
     delete[] tempPtr; 
    } 
    size++; 
} 

ostream& operator << (ostream &out, const DSArray& array){ 
    for (int i = 0; i < array.getSize(); i++) 
     out << array.dynamicArray[i]; 
    return out; 
} 



bool DSArray::deleteEntry(string toDelete) 
{ 
    int index; 
    for(index = 0; index < size; index++) 
    { 
     if(dynamicArray[index] == toDelete) break; 
    } 

    if(index == size) return false; 

    string *newArray = new string[size--]; 

    int i; 
    for(i = 0; i < index; i++) newArray[i] = dynamicArray[i]; 
    for(int k = index + 1; k <= size; k++, i++) newArray[i] = dynamicArray[k]; 

    delete [] dynamicArray; 
    dynamicArray = newArray; 

    return true; 
} 

string DSArray::getEntry(const int index) const{ 
    static string emptyStr = ""; 
    if(index > size){ 
     return emptyStr; 
    } 
    else{ 
     return dynamicArray[index]; 
    } 

} 


void DSArray::operator = (const DSArray& obj){ 
    DSArray temp(obj); 
    if(this->size != 0) 
     delete[] this->dynamicArray; 
    this->size = obj.getSize(); 
    this->dynamicArray = new string [this->size]; 
    for(int i = 0; i < this->size; i++) 
     this->dynamicArray[i] = obj.getEntry(i); 
} 

string DSArray::operator [] (int index){ 
    string emptyString = ""; 
    if (index >= size){ 
     return emptyString; 
    } 
    return dynamicArray[index]; 
} 

int main() 

{ 
    DSArray foods; 
    string x[] = {"Burrito", "Sushi", "Pizza"}; 
    DSArray A(3, x); 
    cout << A; 
    A[3] = "Spaghetti"; 
    foods.addEntry("Steak"); 
    foods.deleteEntry("Sushi"); 




    return 0; 

} 

我想在主要測試我的功能,但它實際上並沒有在控制檯中顯示任何東西。我被告知我的構造函數沒有正確設置大小,因爲調用getSize會返回尚未初始化的對象大小。我究竟如何解決這個問題?也沒有人知道如果getEntry函數得到返回null而不是空字符串?我的任務說它應該返回一個null,但是,當我返回null時,它會給我一個運行時錯誤。任何幫助表示讚賞。謝謝!動態字符串數組的構造函數和空返回

+0

你的構造函數試圖通過'getEntry'初始化'dynamicArray',該''getEntry'進而讀取'dynamicArray'。構造函數有兩個參數 - 你怎麼從來不使用第二個參數?你甚至沒有說出它的名字。 –

+0

'size = getSize()'在這裏,您從尚未初始化的數據成員this-> size中讀取數據,並將生成的隨機垃圾分配給本地變量'size'。而你應該做的恰恰相反。不要混淆你自己,給不同的名字不同的東西。 –

回答

0

您未在構造函數中初始化成員變量size。用途:

DSArray::DSArray(int size, string input[]) : size(size) { ... } 

此外,線

dynamicArray[i] = getEntry(i); 

沒有做任何有用的東西。這本質上是自我分配。

通過爲輸入參數使用不同的名稱,可以避免難以遵循代碼。另外,將輸入字符串數組複製到成員變量。

DSArray::DSArray(int sizeIn, string input[]) : size(sizeIn) { 
    dynamicArray = new string[size]; 
    for (int i = 0; i < size; i++){ 
     dynamicArray[i] = input[i]; 
    } 
}