【问题标题】:Error: constructor must explicitly initialize reference member [duplicate]错误:构造函数必须显式初始化引用成员
【发布时间】:2021-02-26 22:16:11
【问题描述】:

我有以下文件:

汽车.h

#include <iostream>

using namespace std;

namespace CarLibrary { 

  class Car   {
    private:
      string& _producer; 
      string& _model;
      string& _color;

    public:
      Car(const string& producer,
          const string& model,
          const string& color);  

      string Show();

  };

汽车.cpp

#include "car.h"

namespace CarLibrary {

Car::Car(const string& producer,
         const string& model,
         const string& color)
{  
    _producer = producer;
    _model = model;
    _color = color;
}

string Car::Show()
{
    return _model + " (" + _producer + "): color " + _color ;
}

}

我收到以下错误:

C:...\car.cpp:5: 错误:“CarLibrary::Car”的构造函数必须显式初始化引用成员“_producer”

C:..\car.cpp:5: 错误:“CarLibrary::Car”的构造函数必须显式初始化引用成员“_model”

C:...\car.cpp:5: 错误:“CarLibrary::Car”的构造函数必须显式初始化引用成员“_color”

我正在观看视频讲座,重复教授正在做的事情,奇怪的是教授没有收到任何错误,即使我只是复制完全相同的代码。 知道有什么问题吗?

【问题讨论】:

  • 复查:您确定工作代码定义了Car 的成员,如string&amp; _model 而不是string _model
  • @JaMiT 谢谢,就是这样。它实际上是字符串_model

标签: c++ oop reference


【解决方案1】:

必须初始化引用才能引用某些内容。

在这里,您尝试在创建参考后分配参考。这是不合法的:

Car::Car(const string& producer,
         const string& model,
         const string& color)
{  
    _producer = producer;
    _model = model;
    _color = color;
}

解决办法是使用成员初始化器列表:

Car::Car(const string& producer,
         const string& model,
         const string& color) : // colon indicates the start of the member init list
    _producer(producer),
    _model(model),
    _color(color)
{
    // constructor body - now empty
}

注意:为此,您的成员引用变量还需要为const。 参考成员通常不是你想要的。我建议把它们变成普通的std::strings。

【讨论】:

  • 奇怪的是,在视频中,它适用于我的教授,没有错误。我正在使用他提供的相同代码,并使用相同的 IDE(qtcreator) 和编译器。唯一的区别是他在 Linux 上而我在 Windows 上,但我不认为这有什么区别,不是吗?这怎么可能?
  • @J.C.VegaO 你确定Car 中的数据成员是引用而不是对象吗?例如是string&amp; _producer; 还是string _producer;
  • @Kevin 实际上是字符串 _producer
  • @Ted Lyngmo,这就是你所说的“我建议把它们变成普通的 std::strings 的意思。”
  • @J.C.VegaO 是的,完全正确。
猜你喜欢
  • 2013-11-03
  • 2017-09-04
  • 1970-01-01
  • 2014-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多