2017-08-30 122 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]; 
    } 
}