2016-05-30 95 views
0

所以我有2类让我们称之为A类和B,其与这些类的内部对彼此作为一个函数的参数的参考。当我尝试着声明它是这样的:正向声明类,类重定义

// A.h (Header guarded) 
namespace ns { 
    class B { // Attempt to forward declare B 
    public: 
     int getRand(); 
    }; 

    class A { 
    public: 
     float a, b; 

     void aFunc(B &b);  
    }; 
} 

// B.h (Header guarded) 
namespace ns { 
    class A { // Attempt to forward declare A 
    public: 
     float a, b; 
    }; 

    class B { 
    public: 
     void bFunc(A &a); 
     int getRand(); 
    }; 
} 

的事情是,当我这样做,我得到'class' type redefinition错误。我一直在寻找解决方案,但仍未找到解决方案。我做对了吗?我想我不是,你能告诉我我在哪里做错了吗?

+2

不是一个向前声明你到了那里那个! 'B类;'会。 – jrok

+0

@jrok嗯,但如果我需要从A访问B的变量呢?没有它会产生一个错误'不完整的类型是不允许的' – Greffin28

+0

这取决于类。告诉我们更多关于他们以及你想要完成什么。 – jrok

回答

2

他们不是向前声明,他们是绝对的定义。

你应该

// A.h (Header guarded) 
namespace ns { 
    class B; // forward declare B 

    class A { 
    public: 
     // Some functions with B references as arguments   
    }; 
} 

而且它同样为B.h

根据您的情况,也只是其中推展声明的类作为参数的一些成员函数,你可以离开的成员函数的声明在.h文件中,并提供它们的定义在.cpp文件。如

// A.h (Header guarded) 
namespace ns { 
    class B; // forward declare B 
    class A { 
    public: 
     float a, b; 
     void aFunc(B &b);  
    }; 
} 

// B.h (Header guarded) 
namespace ns { 
    class A; // forward declare A 
    class B { 
    public: 
     void bFunc(A &a); 
     int getRand(); 
    }; 
} 

// A.cpp 
#include "A.h" 
#include "B.h" 
namespace ns { 
    void A::aFunc(B& b) { /* ... */ } 
} 

// B.cpp 
#include "A.h" 
#include "B.h" 
namespace ns { 
    void B::bFunc(A& b) { /* ... */ } 
    int B::getRand() { /* ... */ } 
} 
+0

如果我需要从A访问B的变量,该怎么办?没有它,它会产生一个错误'不完整的类型是不允许的'。 – Greffin28

+0

@ Greffin28 - 请重新读了关于面向对象的设计和封装 –

+0

@ Greffin28如果只是它采取向前声明的类作为参数的一些成员函数,你可以离开.h文件中的成员函数的声明,并提供他们在.cpp文件中的定义。 – songyuanyao