[英]Error C2248: Protected Default Constructor C++ within an class owned by another class
我試圖解決從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);
}
我有另一個帶有輸入參數的構造函數,但無論我應用什么邏輯推理,似乎都無法調用它。
啊,現在我們進入了重要的部分(很遺憾,其他答案似乎沒有讓您對理解protected
關鍵字有所幫助 ,但您似乎對提出問題的方式感到有點困惑)。 你有這個構造函數,但你也有一個默認的構造函數。 你寫的工作構造函數有多少並不重要; 非工作的仍然會導致編譯時錯誤。
容器類的默認構造函數沒有初始化列表,因此將嘗試對數據成員使用默認構造函數。 由於您無權訪問該成員的默認構造函數,因此編譯容器的默認構造函數失敗。
可能的解決方案:在容器的默認構造函數的初始化列表中,使用另一個構造函數顯式初始化成員。 這意味着你必須以某種方式彌補價值。 (這並不總是可行。當發生這種情況時,編譯器會告訴您具有默認構造函數對容器類沒有意義。:))
protected
成員只能由派生類的同一實例訪問,而不能由包含此類成員的對象訪問。 您想做的事情無法完成,根據您對protected
的默認構造函數的要求, Goo
不允許創建Foo
的默認構造實例。
您無法通過以下類訪問受保護的成員:
a)不是同一個班級
b)不是由受保護成員的類派生的類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.