处理不完整的类型

我有两个类:其中一个类型不完整,第二个类需要使用不完整类型。有没有办法以类似于引用外部对象的方式引用“外部类型”? 编辑:有关我的类结构的详细信息。 不幸的是我也不能使用指针。我的代码看起来像这样:
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();
  }
};
    

要回复问题请先登录注册