Friday, April 15, 2011

C++ - 2 classes 1 file

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? :)

From stackoverflow
  • put at the first line:

    class B;
    
    Yuval A : You were first, thanks! :)
  • 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

  • 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.

    Evan Teran : good answer, so you get the +1. But for reference the term is "forward declaration"
  • 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) {};
    };
    
  • 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.

  • 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. :) )

  • 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.

    ssg : +1 for saying something different than the bunch
  • Add another declaration of B before A:

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

0 comments:

Post a Comment