【问题标题】:Initializing object and pointer object using uniform initialization does not work使用统一初始化初始化对象和指针对象不起作用
【发布时间】:2018-05-07 12:37:18
【问题描述】:

所以我被困在我认为很容易的事情上。

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


让我们开始吧。我有一个名为“Employee”的类。它的构造函数如下:

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 的早期版本,但我正在尝试学习这些使用花括号(统一初始化)的新技巧。我做错了什么(在这两种情况下)?

附:我用谷歌搜索了很多,但我很困惑该怎么做。我保存的两个资源是这些(但阅读了更多的东西):

【问题讨论】:

  • 你的Employee 有纯虚函数(抽象类型)。与统一初始化无关
  • @appleapple 或者它是从抽象基类派生的,并没有实现完整的接口。无论哪种方式,错误都超出了 Dimitris Pantelis 的预期。
  • @Jodocus 你是对的 :) 我忘了。

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


【解决方案1】:

虽然它在我的电脑上运行良好。在您的情况下,问题可能是uniform initialization。基本上,构造函数是一种特殊的class Method(function, sort-of)。

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

【讨论】:

  • 我对您的答案投了反对票,因为事实并非如此。错误消息泄露了它;)
【解决方案2】:

错误:不能将变量“salariedEmployee”声明为抽象类型“Employee”

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

例如,这是可行的:

#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

但是如果给Employee添加一个纯虚的fire方法,就会编译失败:demo

【讨论】:

  • 你是对的。在 Employee 中有类似“virtual doubleincome() const = 0; // pure virtual”。它甚至说它是纯虚拟的,但并不确切知道它做了什么以及如何使用它。 Employee 确实打算成为“SaliedEmployee”类的基类。谢谢。
猜你喜欢
  • 1970-01-01
  • 2013-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-05
  • 2014-03-14
相关资源
最近更新 更多