繁体   English   中英

C ++静态结构类型成员初始化

[英]C++ Static Struct Type Member Initializations

可能重复: 链接

大家好,

关于静态成员变量,我不了解奇怪的事情。 如果静态变量的“定义”(我不确定它是否合适)在类的头文件中,则编译器会给出链接错误,但是如果它们在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;

似乎我在这里缺少基本信息,不要害羞地在这里和那里提出一些新手技巧:)

提前致谢,

约翰·约翰

编辑:这是链接错误:

1> MasterController.obj:错误LNK2005:“私有:静态布尔UserInterface :: m_undoRequested”(?m_undoRequested @ UserInterface @@ 0_NA)已在Execution.obj中定义1> MasterController.obj:错误LNK2005:“私有:静态枚举ChessViewConstants: :MENU_STATE UserInterface :: m_displayState“(?m_displayState @ UserInterface @@ 0W4MENU_STATE @ ChessViewConstants @@ A)已在Execution.obj 1> MasterController.obj中定义:错误LNK2005:”私有:静态结构ChessModelConstants :: PieceMovement UserInterface :: m_pieceMove (?m_pieceMovement @ UserInterface @@ 0UPieceMovement @ ChessModelConstants @@ A)已在Execution.obj 1> UserInterface.obj中定义:错误LNK2005:“私有:静态布尔UserInterface :: m_undoRequested”(?m_undoRequested @ UserInterface @@ 0_NA)在Execution.obj 1> UserInterface.obj中:错误LNK2005:“私有:静态枚举ChessViewConstants :: MENU_STATE UserInterface :: m_displayState”?m_displayState @ UserInterface @@ 0W4MENU_STATE @ ChessViewConstants @@ A)已经定义 Execution.obj 1> UserInterface.obj:错误LNK2005:“私有:静态结构ChessModelConstants :: PieceMovement UserInterface :: m_pieceMovement”(?m_pieceMovement @ UserInterface @@ 0UPieceMovement @ ChessModelConstants @@ A)已在Execution.obj 1>中定义。 \\ C ++ \\ CheatersChess \\ Debug \\ CheatersChess.exe:致命错误LNK1169:找到一个或多个乘法定义的符号

C ++标准包含一个称为一定义规则的规则。 它的一部分是3.2 / 3:

每个程序应准确地包含该程序中使用的每个非内联函数或变量的一个定义; [...]

当您的问题的静态成员在头文件中定义时,其定义将包含在从包含该头文件的.cpp文件编译的每个.obj文件中。 由于许多文件可能包含该标头,因此您将获得多个定义,这违反了该规则。 (请注意,对于这种违反,所有这些定义是否相同都无关紧要。)

而将定义放在.cpp文件中时,该定义仅包含在从该.cpp文件编译的.obj文件中,因此在链接程序时不会重复定义。

关于第二个问题:您需要定义一个构造函数,该构造函数将成员的期望值用作参数。 实际上,您已经做到了。 您可以使用它来定义静态成员(在.cpp文件中):

ChessModelConstants::PieceMovement UserInterface::m_pieceMovement(-1,-1,-1,-1);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM