【问题标题】: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

标签: c++ class


【解决方案1】:
  1. 添加到您的 root() 构造函数主体 {}
  2. 修复root( string Name ) 构造函数。应该是:

.

root(string Name)
{
    name=Name; // <--- notice reversed order.
}

如果我可以建议,您可以改用 const&amp; 参考:

root( const string& Name )
{
    name=Name;
}

【讨论】:

  • 如果我使用参考会更好吗?
  • 理论上,经过适当优化的编译器应该看到您不需要复制string类型的对象,并且会使用引用,但有时优化可能效果不佳,所以写const type&amp; variable 是一种确保您只愿意获得参考的方式,并且您不会更改它。
  • 或者,更好的是,root(const string &amp;Name) : name(Name) {}
  • +1 给@JonathanLeffler。我自己应该这样写的。
【解决方案2】:

在您的类描述中,您声明了root(),但您没有提供函数的定义。

所以当您执行root Root 时,您是在尝试调用一个不存在的默认构造函数。

【讨论】:

  • 也许值得指出的是,代码应该编译为目标代码,但不应该链接——缺少的函数是链接器错误而不是编译器错误。
【解决方案3】:

如果我有,为什么我的程序不能运行

root Root; //this had to be legal, right?

您声明但从未定义构造函数Root()

还有,

root(string Name)
{
    Name=name;
}

哎呀。您分配给函数局部参数,而不是类成员。

【讨论】:

  • 这是使用构造函数初始化列表的另一个原因。
猜你喜欢
  • 2018-02-02
  • 2020-05-15
  • 1970-01-01
  • 1970-01-01
  • 2019-01-31
  • 1970-01-01
  • 1970-01-01
  • 2021-05-29
  • 1970-01-01
相关资源
最近更新 更多