【问题标题】:dynamic string array constructor and null returns动态字符串数组构造函数和 null 返回
【发布时间】:2018-02-07 15:05:05
【问题描述】:
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;

}

我正在尝试在 main 中测试我的功能,但它实际上并没有在控制台中显示任何内容。有人告诉我,我的构造函数没有正确设置大小,因为调用 getSize 会返回尚未初始化的对象大小。我该如何解决这个问题?还有谁知道 getEntry 函数是否返回 null 而不是空字符串?我的作业说它应该返回一个空值,但是,当我返回一个空值时,它会给我一个运行时错误。任何帮助表示赞赏。谢谢!

【问题讨论】:

  • 您的构造函数尝试通过getEntry 初始化dynamicArray,而后者又从相同的dynamicArray 中读取。构造函数有两个参数 - 为什么你从不使用第二个参数?你甚至没有给它起名字。
  • size = getSize() 在这里,您从尚未初始化的数据成员this-&gt;size 中读取数据,并将生成的随机垃圾分配给局部变量size。而你应该做的恰恰相反。不要混淆自己,给不同的东西起不同的名字。

标签: c++ arrays string pointers


【解决方案1】:

您没有在构造函数中初始化成员变量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];
    }
}

【讨论】:

    猜你喜欢
    • 2015-06-27
    • 2015-06-04
    • 1970-01-01
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    • 2012-12-03
    相关资源
    最近更新 更多