这可能会出啥问题?
Posted
技术标签:
【中文标题】这可能会出啥问题?【英文标题】:What could possibly go wrong on this?这可能会出什么问题? 【发布时间】:2014-04-11 01:49:09 【问题描述】:class root
string name;
public:
root();
root(string Name)
Name=name;
~root();
void setName(string Name)
name=Name;
string getName()
return name;
;
int main()
string name("name");
root Root(name);
Root.setName("name");
cout<<Root.getName();
那我的程序运行顺利,但是为什么我的程序运行不起来呢
root Root; //this had to be legal, right?
而且,我为什么要拥有
root Root(name); //declaring?
再一次
root setName(name);
它必须与它一起工作吗:
root Root; //??
【问题讨论】:
你没有默认构造函数的主体:root()
考虑将root(string Name)
声明为explicit
。
【参考方案1】:
-
添加到您的
root()
构造函数主体
修复root( string Name )
构造函数。应该是:
.
root(string Name)
name=Name; // <--- notice reversed order.
如果我可以建议,您可以改用 const
和 &
参考:
root( const string& Name )
name=Name;
【讨论】:
如果我使用参考会更好吗? 理论上,经过适当优化的编译器应该看到您不需要复制string
类型的对象,并且会使用引用,但有时优化可能效果不佳,所以写const type& variable
是一种确保您只愿意获得参考的方式,并且您不会更改它。
或者,更好的是,root(const string &Name) : name(Name)
。
+1 给@JonathanLeffler。我自己应该这样写的。【参考方案2】:
在您的类描述中,您声明了root()
,但您没有提供函数的定义。
所以当您执行root Root
时,您是在尝试调用一个不存在的默认构造函数。
【讨论】:
也许值得指出的是,代码应该编译为目标代码,但不应该链接——缺少的函数是链接器错误而不是编译器错误。【参考方案3】:如果我有,为什么我的程序不能运行
root Root; //this had to be legal, right?
您声明但从未定义构造函数Root()
。
还有,
root(string Name)
Name=name;
哎呀。您分配给函数局部参数,而不是类成员。
【讨论】:
这是使用构造函数初始化列表的另一个原因。以上是关于这可能会出啥问题?的主要内容,如果未能解决你的问题,请参考以下文章