前向声明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() { /* ... */ }
}
所以我有 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() { /* ... */ }
}