以下代码在使用Visual Studio 2013进行编译时生成链接器错误。
#define MAX_CONTROLLERS 4
class JoypadController {
public:
JoypadController() : m_is_connected(false), m_gamepad(0), m_instance_id(-1), m_haptic(0) {}
int JoypadController::processEvent(const SDL_Event& event);
private:
SDL_GameController *m_gamepad;
SDL_Haptic *m_haptic;
SDL_JoystickID m_instance_id;
bool m_is_connected;
static JoypadController m_controllers[MAX_CONTROLLERS];
static int GetControllerIndex(SDL_JoystickID instance);
void Open(int device);
void Close();
};
static JoypadController m_controllers [MAX_CONTROLLERS];
1> joypad.obj:错误LNK2001:未解析的外部符号"私有:静态类JoypadController * JoypadController :: m_controllers" (?m_controllers @ @@ JoypadController @ 0PAV1 A)
这对JoypadController类有效吗?我在链接器中遗漏了一些简单的东西吗?
答案 0 :(得分:3)
是的,类可以包含与类相同类型的静态成员。例如:
struct S {
static S s; // declaration
};
S S::s {}; // definition
int main() {}
成员不应被定义为具有不完整的类型,并且在类的定义内,该类本身是不完整的。这就是为什么你不能拥有与类本身相同类型的非静态成员。但是,声明类的静态成员不会定义该静态成员。在类定义中声明它,然后进一步定义它。
如果在不定义静态成员的情况下使用静态成员,则会出现链接错误。这与静态成员与类具有相同类型的事实无关。每当您尝试使用尚未定义的对象时,您将收到链接错误。