C ++ - 2个类1个文件

时间:2009-03-24 13:13:50

标签: c++

假设我想在一个.cpp源文件中找到这种东西:

class A {
    public:
        void doSomething(B *b) {};
};

class B {
    public:
        void doSomething(A *a) {};
};

无论如何不执行此操作而不将其拆分为两个单独的文件,并且没有收到编译器错误(doSomething(B *b)上的语法错误)

8 个答案:

答案 0 :(得分:22)

放在第一行:

class B;

答案 1 :(得分:12)

如果我记得很清楚,你可以'预先声明'你的B班。

class B; // predeclaration of class B

class A
{
   public:
      void doSomething(B* b);
}

class B
{
    public
      void doSomething(A* a) {}
}

public void A::doSomething(B* b) {}

然后,你的班级'A'知道班级'B'会存在,虽然还没有真正定义。

正如Evan Teran在评论中提到的那样,前瞻性声明确实是正确的术语。

答案 2 :(得分:4)

使用

向前声明一个类
class B;
or
class A;

但是你仍然无法实现

void doSomething(B *b)

仅使用B的前向声明。所以你必须将doSomething的定义放在完整的A类声明

之下

答案 3 :(得分:3)

是。你需要一个前瞻声明:

class B; // add this line before A's declaration

class A {
    public:
        void doSomething(B *b) {};
};

class B {
    public:
        void doSomething(A *a) {};
};

答案 4 :(得分:3)

The C++ FAQ Lite回答了这个问题及其他问题。我认真考虑从头到尾阅读那个东西,或者拿到这本书并做同样的事情。

答案 5 :(得分:1)

您可以尝试像

这样的前瞻声明
class B;
class A {
  void Method( B* );
};
class B{
};

但是你只能为B声明指针和引用变量。如果你想要更多(比如取消引用B *变量的方法),你可以只提供一个声明,然后在同一个文件中定义方法 - 在两个类声明已经可用的时候。

答案 6 :(得分:1)

您需要转发声明B。

class B; 

class A
{
public:        
   void doSomething(B *b) {}
};

class B 
{    
public:        
   void doSomething(A *a) {}
};

(顺便说一句,在成员函数花括号之后你不需要分号。:))

答案 7 :(得分:0)

在A:

之前添加另一个B声明
class B;

class A {
    public:
        void doSomething(B *b) {};
};

class B {
    public:
        void doSomething(A *a) {};
};