2017-10-20 121 views
1

我不允許使用矢量類,所以我需要自己創建。我做了一個int向量類,它的工作正常,但是當試圖爲字符串做它編譯,但由於指針給我一個錯誤。任何暗示我犯了這個錯誤?我所做的只是更改字符串的每個int元素,但是通常不起作用。請幫忙,我很困惑。創建個人字符串矢量類

public: 
     StringRow(){ 
      elements = new string; 
      size = 0; 
     } 

     ~StringRow(){...} 

     void push_back(string value){...} 

}; 
+0

什麼是錯誤(確切的錯誤消息和它在哪一行發生)?另外你在調試代碼時看到了什麼? – UnholySheep

+0

這不會編譯,是嗎?爲什麼不先修復編譯器錯誤?編譯時發佈[mcve]。 – nvoigt

+2

我首先注意到:'elements = new string;'是* wrong *,因爲之後你會像刪除數組一樣刪除[]'。這已經是*未定義的行爲* – UnholySheep

回答

0

您定義了指向變量的指針,而不是變量數組。

elements = new string; 

elements = new string[size]; 

替換它,您可以優化算法定義初始大小。僅在必要時才創建更大的數組。

+0

你是對的,謝謝!我試過了,但是我得到了一個錯誤的分配異常。我不明白爲什麼這樣做。你知道嗎?? 這是新的錯誤運行時,我得到(它編譯OK) 終止拋「的std :: bad_alloc的」 的實例後,叫什麼()的std ::中止(核心轉儲) – Faulerhund

+0

這種替換也會bad_alloc的 調用*未定義的行爲*,因爲在這一點上'size'沒有被初始化。 'size = 0;'需要在這行之前 – UnholySheep

+0

@UnholySheep我不敢相信我錯過了!真的,我一直在這個小時。乾杯!!非常感謝:) – Faulerhund

0

有幾個問題:

    你不需要任何分配的構造
  • 。您甚至不需要構造函數,您可以在聲明它們時直接初始化成員。
  • 如果您使用string* tmpElementsArray = new string[size + 1];分配,則需要使用delete [] tmpElementsArray取消分配;

修正後加工的版本:

#include <string> 
#include <iostream> 

using namespace std; 

class StringRow { 

private: 
    string* elements = nullptr; 
    int size = 0; 

public: 
// constructor not needed 
// StringRow() { 
//  elements = nullptr; 
//  size = 0; 
// } 

    ~StringRow() { 
    delete []elements; 
    } 

    void push_back(string value) { 

    string* tmpElementsArray = new string[size + 1]; 

    for (int i = 0; i<size; i++) { 
     tmpElementsArray[i] = elements[i]; 
    } 

    delete [] elements; 
    elements = tmpElementsArray; 
    elements[size] = value; 
    size++; 
    } 

    int length() { 
    return size; 
    } 

    string at(int index) { 
    if (index<size) { 
     return elements[index]; 
    } 
    } 
}; 


int main() 
{ 
    StringRow s; 
    string str1 = "hello"; 
    string str2 = "hello2"; 
    s.push_back(str1); 
    s.push_back(str2); 

    cout << s.at(0) << endl ; 
    cout << s.at(1) << endl; 
} 

做一個delete []elements如果elementsnullptr正常。

注意:這不是最有效的方法。

+0

當然,最有效的方法是使用std :: vector :-) – pm100

+0

@ pm100,但OP不應該使用向量。這是一個練習。 –

+0

我知道 - 因此,如果'index> = size','at'函數的笑臉 – pm100