2014-01-29 98 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'也很好:) –

相关问题