2017-08-30 13 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を返すときにそれは私にランタイムエラーを与えると言います。どんな助けもありがとうございます。ありがとう!動的文字列配列のコンストラクタとnullが返される

+0

あなたのコンストラクタはgetAntryを介して 'dynamicArray'を初期化しようとします。これはまったく同じ' dynamicArray'から読み込みます。コンストラクタには2つのパラメータがあります。どのようにして2番目のパラメータを使用しないのですか?あなたはそれに名前をつけなかった。 –

+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]; 
    } 
} 
関連する問題