35

我有一个构造函数试图初始化基类中的字段。编译器抱怨。该字段受保护,因此派生类应该具有访问权限。

//The base class: 

class BaseClass

{

public:

    BaseClass(std::string);
    BaseClass(const BaseClass& orig);
    virtual ~BaseClass();
    const std::string GetData() const;
    void SetData(const std::string& data);
protected:

    BaseClass();
    std::string m_data;

};

BaseClass::BaseClass(const std::string data) : m_data(data) { }

BaseClass::BaseClass() { } 

BaseClass::BaseClass(const BaseClass& orig) { }

BaseClass::~BaseClass() { }

void BaseClass::SetData(const std::string& data)
{
    m_data = data;
}

const std::string BaseClass::GetData() const
{
    return m_data;
}


//The derived class: 


class DerivedClass : public BaseClass
{

public:

    DerivedClass(std::string data);
    DerivedClass(const DerivedClass& orig);
    virtual ~DerivedClass();
private:

};

DerivedClass::DerivedClass(std::string data) : m_data(data) { } //ERROR HERE

DerivedClass::DerivedClass(const DerivedClass& orig) { }

DerivedClass::~DerivedClass() { }

//编译错误

DerivedClass.cpp:3:错误:“DerivedClass”类没有任何名为“m_data”的字段</p>

任何帮助是极大的赞赏。先感谢您。

4

6 回答 6

54

您不能在派生类构造函数中初始化 m_data,而是将其作为参数传递给基类构造函数。

那是:DerivedClass::DerivedClass(std::string data) : BaseClass(data) { }

于 2010-07-23T15:56:49.380 回答
10

在初始值设定项列表中,您可以只为同一类的属性设置值。要访问它,您必须在构造函数的主体中赋予值:

DerivedClass::DerivedClass(std::string data) {m_data = data; }

或者,如果复制对象的成本很高,则将 m_data 作为参数传递给父类构造函数:

DerivedClass::DerivedClass(std::string data) : BaseClass(data) {}

提示:将您的数据作为引用传递以防止复制构造函数。

在此处查看更多信息:C++ 构造函数的初始化顺序

于 2010-07-23T16:00:05.813 回答
4

您不是在“访问” m_data - 您正在初始化它。但是,它已经在基类的 ctor 中初始化了。如果要更改它的值,请在 ctor 的正文中分配给它:

DerivedClass::DerivedClass(std::string data) 
{
   m_data = data;
}
于 2010-07-23T16:00:15.957 回答
2

您需要调用基类构造函数,如下所示:

DerivedClass::DerivedClass(std::string data) : BaseClass(data) {
}

每个类都应该负责初始化它的成员。

于 2010-07-23T16:01:21.650 回答
1

初始化器列表只能用于初始化相关类型所拥有的字段。在初始化列表中初始化基类字段是不合法的,这就是您收到此错误的原因。该字段可在其他范围内访问DerivedClass

于 2010-07-23T15:59:48.783 回答
0

您的派生类构造函数确实可以访问,但您不能在初始化列表中分配给它。将构造函数更改为:

DerivedClass::DerivedClass(const std::string& data)
 : BaseClass(data)
{
}

或者,如果没有合适的基类构造函数可用并且您不能添加一个,则可以将构造函数更改为:

DerivedClass::DerivedClass(const std::string& data)
{
    m_data = data;
}

于 2010-07-23T16:00:30.357 回答