对于像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。可以这样做吗?
答案 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");