簡體   English   中英

處理不完整的類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM