没有初始化就无法声明类?

时间:2011-07-01 01:09:45

标签: c++ class constructor initialization

对于像int这样的标准数据对象,可以完成以下操作

    int number;
    number = 0;

基本上,您可以在初始化之前声明数字,如果您在各种if语句中初始化并且您不希望数字超出范围,则非常有用。

使用自定义类可以做类似的事情吗?

我有一个名为mem_array的类,其构造函数为

    mem_array(int,int,std::string);

我想做以下

      mem_array myData;
      if(x==0) myData(1,1,"up");
      if(x==1) myData(0,0,"down");

基本上,所以我可以在if语句范围之外使用myData。可以这样做吗?

7 个答案:

答案 0 :(得分:4)

你的第一行会给你一个错误,因为构造函数没有默认值,并且没有参数的构造函数不存在。

只需使用指针(甚至更好的智能指针,所以你不必去处理删除对象)。但请务必在事后检查x是0还是1,即检查myData是否已构建。

mem_array* myData=0;
if(x==0) myData=new mem_array(1,1,"up");
if(x==1) myData=new mem_array(0,0,"down);

assert(myData!=0);

答案 1 :(得分:2)

向mem_array添加一个带有int

的构造函数

这样你就可以声明/使用......

mem_array myData(x);

在此构造函数中,添加要使用的初始化/条件代码。

答案 2 :(得分:1)

您可以使用指针:

unique_ptr<mem_array> myData;
switch (x) {
case 0:
    myData.reset(new mem_array(1, 1, "up"));
    break;
case 1:
    myData.reset(new mem_array(0, 0, "down"));;
    break;
}

答案 3 :(得分:1)

int number;
number = 0;

最后一行显式为number = int(0);。换句话说,使用类型:

mem_array myData;
if (x == 0) myData = mem_array(1, 1, "up");
if (x == 1) myData = mem_array(0, 0, "down");

这很遗憾地要求你重载operator =():

class mem_array
{
   ...
 public:
  mem_array& operator= (const mem_array& cma);
  {
    /* Copy the information from cma to *this. */

    /* Return a reference to this object. */
    return *this;
  }
};

另一种方法是使用其他人推荐的指针(动态分配)。这取决于你最终使用的。

答案 4 :(得分:0)

声明就像自动调用默认构造函数(即没有参数或所有参数都有默认值)。当您的类没有任何构造函数时,编译器会自动创建它,但由于您有一个构造函数,因此它不会自动创建。因此,声明失败,因为它找不到默认构造函数。

答案 5 :(得分:0)

?:运营商被低估了。

mem_array myData = (x==1) ? myData(1,1,"up") : myData(0,0,"down");

答案 6 :(得分:0)

另一种解决方案是使用boost::optional<T>。这清楚地表明您的变量可以保存值not-a-T。 E.g。

boost::optional<mem_array> myData; // Doesn't hold a mem_array yet.
if(x==0) myData = mem_array(1,1,"up");
if(x==1) myData = mem_array(0,0,"down");