使用统一初始化初始化对象和指针对象不起作用

时间:2017-11-23 14:02:40

标签: c++ c++11 object initialization

所以我陷入了一些我认为很容易的事情。

注意:以下所有内容均适用于C ++ 11及更高版本。

让我们开始吧。我有一个名为“员工”的班级。其构造如下:

Employee::Employee(const string& first, const string& last, const string& ssn)
      : firstName(first), lastName(last), socialSecurityNumber(ssn) {}

此外,在尝试创建对象时,在我的主要内容中,我执行以下操作:

void main()
{
string firstName;
string lastName;
string socialSec;
Employee salariedEmployee{firstName, lastName, socialSec};
}

我收到错误:

  

错误:无法将变量'salariedEmployee'声明为抽象   输入'员工'

然后我尝试将对象创建为指针,如下所示:

Employee *salariedEmployee{&firstName, &lastName, &socialSec};

并收到错误:

  

错误:标量对象'salariedEmployee'在初始化程序中需要一个元素

我不明白我做错了什么。我习惯编码是以前版本的C ++ 11,但我正在尝试学习使用花括号(统一初始化)的这些新技巧。我做错了什么(在这两种情况下)?

P.S。我google了很多,但我很困惑该怎么做。我保存的两个资源就是这些(但已经阅读了更多东西):

2 个答案:

答案 0 :(得分:3)

  

错误:无法声明变量' salariedEmployee'是抽象类型'员工'

此错误与您调用构造函数的方式无关。它只是说你试图实例化一个尚未完全定义的类型,它的一些方法是纯虚拟的。

例如,这有效:

#include <string>

struct Employee
{
    Employee(const std::string& first, const std::string& last, const std::string& ssn);

    std::string firstName;
    std::string lastName;
    std::string socialSecurityNumber;
};

Employee::Employee(const std::string& first, const std::string& last, const std::string& ssn)
    : firstName(first), lastName(last), socialSecurityNumber(ssn)
{}

int main()
{
    std::string firstName;
    std::string lastName;
    std::string socialSec;
    Employee bob{firstName, lastName, socialSec};
}

demo

但是,如果您向fire添加纯虚拟Employee方法,则无法编译:demo

答案 1 :(得分:-1)

虽然它在我的电脑上工作正常。在您的情况下,问题可能是uniform initialization。基本上,构造函数是一种特殊的class Method(函数,排序)。

因此,将参数传递给函数的方法是使用括号(),而不是通过统一初始化。