簡體   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