2011-04-02 78 views
3

處理我有兩類:其中一人有一個不完整的類型,第二個需要使用不完全類型。有沒有什麼辦法像引用外部對象那樣引用「外部類型」?使用不完全類型


編輯:我的類的結構詳細信息。

不幸的是我也不能使用指針。我的代碼看起來是這樣的:

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(而不是朋友)會暴露實現的結論。

+1

這是一個很廣泛的問題。您可能想要發佈您想要做的事情的示例,然後有人可能會爲您提供解決方案。 – ltc 2011-04-02 08:23:16

+0

由於CompleteB是一位朋友,我不明白爲什麼你不在CompleteA中使用私有getter(它可以在別的地方實現),就像@Matthieu M.建議的那樣。這裏絕對沒有問題,帶有不完整類型的pimpl習慣用法很常見,這是您跨入pimpl類實現的方式。 – 2011-04-02 23:21:21

回答

2

我真的無法理解你的問題正確。

但是從我個人理解,我只能說是一個不完整的類型可以作爲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! 

我希望這個信息會幫助你找到實際解決您的問題!

6

使用前向聲明。

在你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的類型並取消引用;但這是一個醜陋而不安全的解決方案。

1

有一個非常簡單的解決方案,如果你只需要訪問someMember:提供一個私人吸氣,用脫節的定義。

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(); 
    } 
}; 
+0

爲什麼這會得到downvoted?這是最好的答案! – 2011-04-02 23:19:56

+0

因爲我特意說getters在這種情況下不好,因爲這個暴露的實現。 – 2011-04-03 05:28:50

+1

@Paul:私人獲得者不會再暴露任何東西。你正在使用朋友類,所以你已經公開實現。 – 2011-04-03 12:28:35