我已經搜索了一些SO文章,但還沒有發現任何東西(但),相當我的問題。道歉,如果這個答案已經存在的地方。C++嵌套類
背景第一的位......
我要代表一個設備與功能「部分」,其中的功能具有分層樹形結構。而不是有扁平功能的負載像
DeviceReferenceCheck(),
DeviceRefereceSet(),
DevicePhaseSetX(),
DevicePhaseDefaultsSet...()
我反而想利用嵌套類,所以我可以得到
dev.reference.check()
dev.reference.set()
dev.phase.setx()
dev.phase.defaults.set...()
要做到這一點,我嘗試使用嵌套類,將得到obj.func.subfunction.subsub....()
結構。嵌套類需要對最外層類的引用,因爲它們需要使用那裏提供的讀/寫函數。
在我的嘗試中,我不明白的第一件事情如下...我自己嘗試過,但因編譯器警告而停止使用它。
class GPIBDevice_Agilent53132A : public GPIBDevice
{
private:
class RefOsc {
public:
// ... snip ...
RefOsc(GPIBDevice_Agilent53132A &parent);
// ... snip ...
} ro;
public:
// ... snip ...
GPIBDevice_Agilent53132A();
// ... snip ...
};
GPIBDevice_Agilent53132A::GPIBDevice_Agilent53132A() : GPIBDevice(), ro(*this)
{
}
編譯器說:gpibdevice_agilent53132a.cpp(5): warning C4355: 'this' : used in base member initializer list
。
啊哈,我認爲自己...聰明的編譯器...在初始化列表中使用this
可能不是一個好主意,因爲類尚未完全構造。
問題1: 我上面說的正確嗎?在封閉類的初始化列表中使用this
爲嵌套類提供對封閉類的引用,這是一個壞主意?我的想法是「是」,但希望澄清一下,因爲在其他SO線程中,我已經看到使用這種方法(Nested Class member function can't access function of enclosing class. Why?)。
我的方法來解決這個問題是有一個成員指針嵌套,然後實際上在構造函數中(所以現在可以安全地使用這個類作爲構造)作出了一個新的內部類,我可以傳入參考*沒有警告。這是做這件事的標準方式嗎?
繼續上....
的原因私有嵌套類是順便說一句,我不希望用戶能夠實例化類的他/她。現在,我確實已經公開了...嘗試在嵌套類中使用私有構造函數,但編譯器告訴我它不能構造類。所以大概封閉類可以看到嵌套的類私有數據成員?
問題2: 爲什麼不能封閉類看到嵌套類的私有數據成員/功能?
我的工作是爲了讓嵌套類聲明封閉類作爲朋友。這真的有必要嗎?
謝謝你幫助傢伙!
在初始值設定項列表中使用'this'不是一個好主意,因爲如果您訪問尚未構造的類的成員,您的程序可能會崩潰。話雖如此,如果您只是存儲指針以備將來使用,則不會有任何問題。 – mkirci
如果基類ctor只存儲引用,則它是安全的。在這種情況下,我不會馬上把它稱爲一個壞主意,但我會仔細看看這個設計,因爲它可能是其他問題出現的標誌。 –
好的,謝謝你們。我解決這個問題的方法是讓一個成員指針嵌套,然後當實際在構造函數中(因此現在可以安全地使用這個類作爲構造函數)創建了一個'new'內部類,我可以將引用傳遞給' *這個'沒有警告。這是做這件事的標準方式嗎?我提到的另一個SO線程是如何使用前一種方法的? – Jimbo