2014-01-29 96 views
0

我想要創建一個結構數組,但我得到錯誤no matching function for call to 'Cell::Cell()'創建一個結構數組

Cell是我的結構的名稱。這裏是我的一些代碼:

struct Cell{ 
    int number; 

    Cell(int n){ 
     number = n; 
    } 
}; 

class MyClass{ 
    public: 
     int nCells; 

     void inject(){ 
      std::cout << "Enter number:"; 
      string in; 
      std::cin >> in; 
      int amount = in.size()/3; 

      Cell cells [amount]; // <-- error 

      int index = 0; 
      int t = in.size(); 
      while (t >= 3){ 
       cells[index] = new Cell(atoi(in.substr(t-3,3).c_str()); 
       t -= 3; 
       index++; 
      } 
     } 

     MyClass(int n){ 
      nCells = n; 
     } 
}; 

Cell cells [amount];給我的錯誤。我對類很陌生,但我知道如何創建基本類型的數組。例如,int cells [amount];就可以工作。

但我該如何製作一個Cell類型的數組?

+3

使用std ::矢量 – Davidbrcz

+1

哪裏是默認的構造函數中的細胞?你沒有它。 – Jepessen

回答

4

Cell可是沒有一個默認的構造函數(只要您指定的另一個構造函數,編譯器不會再創建一個默認的構造函數)。但是定義Cell cells[amount]會自動默認初始化每個元素。

我覺得在這種特殊情況下的最佳方法就是實現一個默認的構造函數:

struct Cell{ 
    int number; 

    Cell() : number(0) 
    { 
    } 

    Cell(int n) : number(n) 
    { 
    } 
}; 

還要注意爲amount在編譯時是不知道,Cell cells[amount]基本上是非法的。但是一些編譯器有擴展來允許這樣做。但它更好,如果你堆分配它:

Cell* cells = new Cell[amount]; 

不要忘了摧毀它。

+0

現代C++更喜歡std :: shared_ptr cells(new Cell [amount]),因爲那樣你就不會忘記要銷燬它。 –

+0

它的工作原理!我有一個問題:我們編寫構造函數的方式有區別嗎?你寫'Name(argument):number(n){}',而我寫'Name(argument){number(n)}' – Chronicle

+2

這與你的問題是一樣的故事。 「:number(n)」使用參數n調用編號的構造函數。 {number = n; }調用數字的默認構造函數,然後AFTER確定number = n。在這種情況下,沒有真正的區別,但總的來說它效率較低 - 如果你沒有默認的構造函數(就像你沒有),它實際上會失敗。 –

0

這樣做Cell cells [amount];您呼叫的Cell構造,但在這種情況下,你不會有一個默認的構造函數爲Cell,所以你必須使用指針代替,您使用的是他們在while東西。

只要改變

Cell cells [amount]; 

Cell* cells [amount]; 
+1

@JohnDibling,它有一個構造函數,但不是默認的......這就是爲什麼它會崩潰。 – Netwave

+1

@JohnDibling它有一個構造函數,但不是* default *構造函數。 – crush

+0

哦,當我早些時候查看這個問題時,它確實看起來沒有任何定義的構造函數。我一定是錯過了它。 –

2

如果你知道數組有多長,你可以使用C++ 11初始化。這將做到:

int main() 
{ 
    Cell c[3]{ Cell(1), Cell(2), Cell(3) }; 
} 

通過這個

Cell cells [amount]; 

使用沃拉斯的方式,而不是用C++的支持(只延長一些編譯器)。

在C++中,更好的辦法是使用std::vector

#include <vector> 


struct Cell{ 
    int number; 

    Cell(int n){ 
     number = n; 
    } 
}; 

int main() 
{ 
    int n = 5; 

    std::vector<Cell> c; 

    for (int i =0; i < n; ++ i) 
    { 
     c.emplace_back(Cell(i)); 
    } 
} 
+0

爲什麼'emplace_back'在這裏,只有在'push_back'會生成完全相同的代碼時才被C++ 11支持。 –

+0

@JamesKanze不知道。正如你所說,'push_back'也很好:) –

相關問題