[英]Dealing with incomplete types
我有兩個類:其中一個類型不完整,第二個類需要使用不完整類型。 有沒有辦法以類似於引用外部對象的方式引用“外部類型”?
編輯:有關我的類結構的詳細信息。
不幸的是我也不能使用指針。 我的代碼看起來像這樣:
class CompleteA {
private:
friend CompleteB;
struct IncompleteA;
boost::shared_ptr<IncompleteA> data_;
};
class CompleteB {
public:
void SomeFct(CompleteA& a) {
// I need to access a member of the incomplete type
a.data_->someMember;
}
};
我可以有一個單獨的標題和源文件對,但在我的情況下,這將是一個過度殺傷。 不完整類型只是一個包含一個成員的結構; 我用它來隱藏實現。 (但是,如果沒有其他選擇,我將采用單獨的標題......)
關於我對朋友的使用,請忽略它並專注於我正在尋求幫助的內容。 我一直在考慮是否應該在這里使用朋友,我得出的結論是,使用getter(而不是朋友)會暴露實現。
使用前向聲明。
在你的yourotherclass.h中:
class IncompleteClass;
class YourOtherClass
{
IncompleteClass* member;
};
在yourotherclass.cpp中,您實際上需要包含incompleteclass.h才能使用指針。
編輯:回復您的詳細信息:
如果要隱藏實現,請為其創建一個單獨的(朋友)類,並引用該類:
class CompleteAImpl
{
friend CompleteA;
// data, members, etc. that you intend to hide
};
class CompleteA
{
CompleteAImpl* priv; // or shared_ptr if you want
};
我想你想做這樣的事情。 您的實現的問題是,為了引用成員結構/類,編譯器需要知道該成員和前面成員的大小。 您可以將(a.data_ + sizeof(all preceding members))
轉換為someMember
的類型並取消引用; 但這是一個丑陋且不安全的解決方案。
我無法正確理解你的問題。
但據我所知,我只能說不完整的類型只能用作代碼中的pointer
。
struct A; //incomplete type, since it has not been defined yet!
A *pA; //okay - pointer to an incomplete type is allowed!
A a; //error - cannot declare an automatic variable of incomplete type!
我希望這些信息可以幫助您找到問題的實際解決方案!
有一個非常簡單的解決方案,如果您只需要訪問someMember
:提供一個私有的getter,具有一個out-line定義。
class A {
private:
friend B;
int getSomeMember() const; // defined in .cpp
struct IncompleteA;
boost::shared_ptr<IncompleteA> data_;
};
class B {
public:
void SomeFct(A& a) {
a.getSomeMember();
}
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.