处理不完整的类型

时间:2011-04-02 08:15:15

标签: c++ incomplete-type

我有两个类:其中一个类型不完整,第二个类需要使用不完整类型。有没有办法以类似于引用外部对象的方式引用“外部类型”?


编辑:关于我的课程结构的详细信息。

不幸的是我也不能使用指针。我的代码看起来像这样:

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(而不是朋友)会暴露实现。

3 个答案:

答案 0 :(得分: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 :(得分: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!

我希望这些信息可以帮助您找到解决问题的实际解决方案!

答案 2 :(得分:1)

有一个非常简单的解决方案,如果您只需要访问someMember:提供一个私有的getter,带有一个外行定义。

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