转发声明类,类重新定义

时间:2016-05-30 09:38:00

标签: c++ header forward-declaration

所以我有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错误。我一直在寻找解决方案,但仍然没有找到解决方案。我这样做对吗?我想我不是,你能告诉我我在哪里做错了吗?

1 个答案:

答案 0 :(得分: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() { /* ... */ }
}