【问题标题】:Error C2248: Protected Default Constructor C++ within an class owned by another class错误 C2248:另一个类拥有的类中受保护的默认构造函数 C++
【发布时间】:2011-12-15 21:43:51
【问题描述】:

我正在尝试解决我从 Microsoft Visual Studio 10 编译器得到的这个错误。错误是: Some class : error C2248: cannot access protected member declared in class ''。这是重现此错误的代码。我似乎无法弄清楚如何创建一个拥有另一个对象的对象,该对象具有受保护的默认构造函数。我有另一个构造函数,它接受一个输入参数,但无论我应用什么逻辑推理,似乎都无法调用它。显然,我错过了一些愚蠢或非常重要的东西,所以我把它放在这里看看是否有人能发现我的错误。谢谢大家!!!

#ifndef FOO_H
#define FOO_H

class Foo {
    public :
        int myFooInt;

        ~Foo();

        Foo(int fooInt);

    protected :   //Uncomment to generate C2248 Error
        Foo();
};

#endif

.

#include "foo.h"

Foo::Foo() {

}
Foo::Foo(int fooInt) : myFooInt(fooInt) {

}

Foo::~Foo() {
}

.

#ifndef GOO_H
#define GOO_H

#include "foo.h"

class Goo {
    public :

        ~Goo();

        Goo();

        Goo(Foo foo);

        Foo myFoo;

};

#endif 

.

#include "Goo.h"

Goo::Goo() {

}

Goo::Goo(Foo foo) : myFoo (foo) {
}

Goo::~Goo() {
}

.

#include "foo.h"
#include "goo.h"

void main() {
    Foo foo(5);
    Goo goo(foo);
}

【问题讨论】:

    标签: c++ constructor protected


    【解决方案1】:

    我有另一个构造函数,它接受一个输入参数,但无论我应用什么逻辑推理,似乎都无法调用它。

    啊,现在我们进入了重要的部分(很抱歉,其他答案似乎没有让您理解 protected 关键字,但您确实似乎有点困惑你提出问题的方式)。你确实有那个构造函数,但是你有一个默认的构造函数。编写多少工作构造函数并不重要;不工作的仍然会导致编译时错误。

    容器类的默认构造函数没有初始化列表,因此会尝试使用数据成员的默认构造函数。由于您无权访问成员的默认构造函数,因此编译容器的默认构造函数会失败。

    可能的解决方案:在容器的默认构造函数的初始化列表中,使用另一个构造函数显式初始化该成员。这意味着您必须以某种方式弥补价值。 (这并不总是可能的。发生这种情况时,编译器会告诉您,拥有默认构造函数对容器类没有意义。:))

    【讨论】:

    • 非常感谢!!!!早些时候,我在容器类的构造函数上有一个带有 int 输入参数的初始化列表,但没想到我的默认构造函数也有它。非常感谢您仔细阅读我的帖子。
    【解决方案2】:

    protected 成员只能被派生类的同一个实例访问,不能被包含此类成员的对象访问。你想做的事做不到,Goo不允许根据你对默认构造函数protected的请求创建Foo的默认构造实例。

    【讨论】:

      【解决方案3】:

      您不能通过以下类访问受保护的成员:

      a) 不是同一个类

      b) 不是由具有受保护成员的类派生的类。

      【讨论】:

        猜你喜欢
        • 2011-05-30
        • 2019-08-27
        • 1970-01-01
        • 2016-04-07
        • 2012-06-04
        • 1970-01-01
        • 1970-01-01
        • 2011-10-23
        • 1970-01-01
        相关资源
        最近更新 更多