【问题标题】:C++ instantiate a class [duplicate]C ++实例化一个类[重复]
【发布时间】:2013-03-08 18:33:02
【问题描述】:
#include <iostream>

class Base
{
    public:
        int id;
};

int main()
{
    Base b();
    b.id = 1; 
}

上面代码中的对象创建有什么问题? Base b()Base b有什么区别?

【问题讨论】:

  • 如果你有一个构造函数会有所帮助,例如 Base(int id);
  • @Cheersandhth.-Alf 我确定它是重复的,但这不是最令人烦恼的解析。
  • @QuentinUK 不,不会
  • @juanchopanza:当然,除非您接受基于形式语法的不切实际、愚蠢、白痴、脑残、智障等等的区别(我敢肯定 Scott 没有就是那个意思,但他无法预见会被非常字面意思的无思想解释)
  • @AndyProwl 哦,我明白你的意思了。但是,出于同样的原因,我可以说TimeKeeper time_keeper(Timer()); 也不是一种在语法上有效的声明对象的方式,因为它是一个函数,因此 MVP 不存在,对吧?我的意思是,如果我想争论。

标签: c++


【解决方案1】:

这个

Base b();

被解析为一个名为 b() 的函数的函数声明,该函数返回一个 Base 对象。你需要这个:

Base b;

这将实例化一个Base 对象并调用其默认构造函数。请注意,这不会将 base::id 初始化为零。您可以通过提供执行此操作的默认构造函数来解决此问题:

class Base
{
    public:
        Base() : id(0) {}
        int id;
};

并以同样的方式实例化:

Base b;

【讨论】:

  • 我认为,如果有人觉得产生一个新的答案比参考无数现有的答案更好,那么可以期待一个更完整的答案(即,现有答案中缺少的内容)这里)
【解决方案2】:

问题在于您不是实例化一个对象,而是声明一个函数。这个:

Base b(); // Function declaration! (not what you want)

声明一个函数b(),它返回一个Base类型的对象并且不接受任何参数。因此,当您稍后尝试访问成员 id 时,编译器会发出错误,因为函数没有成员:

b.id = 1; // ERROR! b is a function, accessing member "id" makes no sense

如果您想创建Base 的实例,只需删除括号即可:

Base b; // Object instantiation! (what you want)

请注意,在 C++11 中,您可以使用 统一初始化 语法几乎按照您尝试的方式创建类的实例,但使用花括号而不是括号:

Base b{}; // Object instantiation! (what you want, in C++11)

【讨论】:

  • 哦,我现在明白了……我仍然觉得很奇怪,我能够在主函数中声明一个函数,但不能在那里定义它。
猜你喜欢
  • 2020-01-01
  • 2016-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-24
  • 1970-01-01
  • 2010-11-08
相关资源
最近更新 更多