前向声明classes,class重定义

Forward declare classes, class redefinition

所以我有 2 个 classes 让我们称它为 class A 和 B,在这些 classes 内部有一个相互引用作为函数的参数。当我尝试像这样转发声明时:

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

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

你应该

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

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

B.h也是如此。

根据你的情况,只有一些成员函数向前声明class作为参数,你可以将成员函数的声明留在.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() { /* ... */ }
}