【问题标题】:Initializer list doesn't detect publicly inherited member初始化器列表未检测到公开继承的成员
【发布时间】:2016-03-14 21:24:52
【问题描述】:

快速问题:我认为成员初始化列表的行为与使用“=”的正常初始化相同(除了只能使用初始化列表定义的 const 成员),调用具有特定的待初始化对象的构造函数我正在传递的参数,如下例所示(我正在调用 x 的构造函数,其值为 1)。但令我惊讶的是,在简单继承的情况下,编译器抱怨没有看到我试图用我的构造函数初始化的成员,尽管看到另一个用通常的 '=' 语法初始化的成员:

#include <iostream> 
using namespace std;

class A
{
public:

    int x;
    int y;
};

class B : public A
{
public:

    B() : x(1)
    {
        y = 2;
    }
};

int main()
{   
    return 0;
}

如果您运行上面的代码,您会看到虽然 y 被检测到没有问题,但您的编译器会说在 'B() : x(1)' 行没有名为 'x' 的此类成员。这是为什么?继承是公开的,可以看到 y,那里没有问题,为什么 x 也没有?

【问题讨论】:

标签: c++ inheritance constructor initializer-list


【解决方案1】:

你不能从类B的初始化列表中初始化x,因为只有类A可以初始化它的成员。

顺便说一句,将数据成员公开并不是一个好主意。这是您的代码如何工作的示例:

#include <iostream> 
using namespace std;

class A
{
public:
    A(int x, int y) : x(x), y(y) {}
protected:

    int x;
    int y;
};

class B : public A
{
public:

    B() : A(1, 5000)
    {
        y = 2;
    }
};

int main()
{   
    return 0;
}

【讨论】:

  • 是的,在看到你的帖子之前我已经找到了解决方案,它在下面,标记为答案。谢谢您的帮助!是的,我知道数据几乎永远不应该公开,只是出于举例目的,我总是将它们设为私有,因为将它们设为私有将需要我也使用 setter/getter,这只会使代码 sn-ps 比它们应该的更长.但是,在这种情况下使它们受到保护将不需要 setter/getter,所以是的,在这个例子中,你的权利,我的懒惰超出了必要的程度:)
  • @Otringal 我没有看到任何标记的答案。无论如何,你明白出了什么问题,这才是最重要的。我也赞成你的问题,因为它显示了一些努力。
  • 非常感谢!!!我已将您的答案重新标记为“那个”,不知道为什么它第一次没有坚持:/
  • 在@Otringal 2 天过去之前,您不能接受自己的答案。谢谢!
【解决方案2】:

我想我找到了答案:

在执行 A 类的构造函数时,我的对象已经被初始化一次,因此在运行 B 的构造函数时我无法重新初始化它。将 y 重新赋值为 2 是可以的,但是使用 1 作为其构造函数参数传递的重新初始化 x 是编译器错误的原因。我还缺少什么吗???

【讨论】:

  • 最好删除这个并接受 gsamaras 的回答
猜你喜欢
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-25
  • 2015-11-28
  • 2015-02-28
  • 1970-01-01
相关资源
最近更新 更多