инициализация Возможные дубликат: linkC++ Статические Struct Тип члены
Привет всем,
Там странная вещь, которую я не понимаю, о статических переменных-членов. Если «определение» (я не уверен, что это правильное слово для него) для статических переменных находится в заголовочном файле класса, компилятор дает ссылки на ошибки, однако, если они находятся в файле cpp, все в порядке.
У меня есть класс, как следует (не наклеить всю вещь):
UserInterface.h
class UserInterface
{
public:
UserInterface(void);
~UserInterface(void);
// Some method declarations here
private:
// Some more methods declarations here
// VARIABLES
static bool m_undoRequested;
static ChessViewConstants::MENU_STATE m_displayState;
static ChessModelConstants::PieceMovement m_pieceMovement;
};
// THESE DO NOT WORK (linking errors)
//bool UserInterface::m_undoRequested = false;
//ChessViewConstants::MENU_STATE UserInterface::m_displayState = ChessViewConstants::MAIN_MENU;
//ChessModelConstants::PieceMovement UserInterface::m_pieceMovement(1, 1, 1, 1);
UserInterface.cpp
#include "UserInterface.h"
// These do work.
bool UserInterface::m_undoRequested = false;
ChessViewConstants::MENU_STATE UserInterface::m_displayState = ChessViewConstants::MAIN_MENU;
ChessModelConstants::PieceMovement UserInterface::m_pieceMovement(1, 1, 1, 1);
// Implementation....
ChessConstants .h
namespace ChessModelConstats{
// Some stuff here...
struct PieceMovement {
// A simple Constructor
PieceMovement(int originRow = -1, int originCol = -1,
int targetRow = -1, int targetCol = -1)
: m_originRow(originRow), m_originCol(originCol),
m_targetRow(targetRow), m_targetCol(targetCol)
{
}
// Members
int m_originRow;
int m_originCol;
int m_targetRow;
int m_targetCol;
};
// More stuff here....
}
Итак, почему статические переменные должны быть реализованы внутри файла cpp? Почему я не могу добавить в конец файла заголовка?
Второй вопрос: как я могу инициализировать переменную структуры (m_pieceMovement), как следует за:
m_pieceMovement.m_originCol = -1;
m_pieceMovement.m_originRow = -1;
m_pieceMovement.m_targetCol = -1;
m_pieceMovement.m_targetRow = -1;
Кажется, я пропускаю основную информацию здесь, не стесняйтесь, чтобы бросить в некоторых новичков советы здесь и там :)
заранее спасибо,
John John
EDIT: Вот связывающие ошибки:
1> MasterController.obj: ошибка LNK2005: "частный: статический BOOL :: m_undoRequested пользовательского интерфейс" (? M_undoRequested @ @@ 0_NA пользовательский интерфейс) уже определены в Execution.obj -> MasterController.obj: ошибка LNK2005: "private: static enum ChessViewConstants :: MENU_STATE UserInterface :: m_displayState" (? m_displayState @ UserInterface @@ 0W4MENU_STATE @ ChessViewConstants @@ A), уже определенный в Execution.obj 1> MasterController.obj: ошибка LNK2005: "private: static struct ChessModelConstants :: PieceMovement UserInterface :: m_pieceMovement "(? M_pieceMovement @ UserInterface @@ 0UPieceMovement @ ChessModelConstants @@ A), уже определенный в Execution.obj 1> UserInterface.obj: ошибка LNK2005:" private: static bool UserInterface :: m_undoRequested "(? m_undoRequested @ UserInterf ace @@ 0_NA), уже определенный в Execution.obj 1> UserInterface.obj: ошибка LNK2005: "private: static enum ChessViewConstants :: MENU_STATE UserInterface :: m_displayState"? m_displayState @ UserInterface @@ 0W4MENU_STATE @ ChessViewConstants @@ A) уже определено в Execution.obj 1> UserInterface.obj: ошибка LNK2005: "private: static struct ChessModelConstants :: PieceMovement UserInterface :: m_pieceMovement" (? m_pieceMovement @ UserInterface @@ 0UPieceMovement @ ChessModelConstants @@ A), уже определенный в Execution.obj 1 > D: \ C++ \ CheatersChess \ Debug \ CheatersChess.exe: фатальная ошибка LNK1169: один или несколько умножить определенные символы найдены
Ваш второй вопрос совершенно неясно. Структура имеет конструктор по умолчанию, кроме того, эти члены данных являются общедоступными, так что проблема с их инициализацией ?! –
Если у вас есть два вопроса, возможно, вам следует задать два отдельных вопроса. –
Ну, есть случаи, когда я хочу объявить статический член типа объекта. Я хотел бы инициализировать его с помощью object-> initialize() или что-то в этом роде. Конечно, я хотел бы инициализировать его только один раз. Тогда как мне это сделать? Я не могу сделать это в конструкторе, единственный вариант, похоже, делает объект #define ObjectInitialized 1, который я бы хотел избежать. –