tags:

views:

619

answers:

8

Suppose I want something of this sort, in one .cpp source file:

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

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

Is there anyway of doing this without splitting it into two separate files, and without receiving a compiler error (syntax error on doSomething(B *b))


Thanks, all 5 of you. Who exactly am I supposed to mark as accepted? :)

+17  A: 

put at the first line:

class B;
Jiri
You were first, thanks! :)
Yuval A
+4  A: 

forward declare one class before other with

class B;
or
class A;

But still you won't be able to implement

void doSomething(B *b)

using only forward declaration of B. So you have to put definition of doSomething below full class A declaration

Mykola Golubyev
+9  A: 

If I remember well, you can 'pre-declare' your class 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) {}

Then, your class 'A' knows that a class 'B' will exists, although it hasn't been really defined yet.

Frederik Gheysels
good answer, so you get the +1. But for reference the term is "forward declaration"
Evan Teran
+3  A: 

Yes. You need a forward declaration:

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

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

class B {
    public:
        void doSomething(A *a) {};
};
Mr Fooz
+1  A: 

You can try a forward declaration like

class B;
class A {
  void Method( B* );
};
class B{
};

but you will only be able to declare pointer and reference variables for B then. If you want more (like a method that dereferences B* variable) you can provide a declaration only and define methods later in the same file - at the point where both classes declaration is already available.

sharptooth
+1  A: 

You need to forward declare B.

class B; 

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

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

(And BTW, you don't need the semi-colons after the member function curly braces. :) )

Brian Neal
+2  A: 

The C++ FAQ Lite answers this question and others. I'd seriously considering reading that thing end to end, or getting the book and doing the same.

Brian
+1 for saying something different than the bunch
ssg
A: 

Add another declaration of B before A:

class B;

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

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