【问题标题】:Undefined reference to static member of class对类的静态成员的未定义引用
【发布时间】:2019-10-09 11:31:08
【问题描述】:

我即将学习 C++ 中的基本 OOP 操作,现在我遇到了与类的静态成员有关的问题。我尝试构建简单的纸牌游戏。我创建类RulesDeckCard

我的Deck 类从Rules 类中获取规则和一些常量,然后做一些事情。我只在主函数中使用Deck::createDeck();,没有别的。当我尝试编译代码时出现结果错误:

/usr/bin/ld: CMakeFiles/CardGame.dir/Sources/Rules.cpp.o: 在函数Rules::getSuits[abi:cxx11]()': /home/bartosz/CLionProjects/CardGame/Sources/Rules.cpp:12: undefined reference toRules::suits[abi:cxx11]' /usr/bin/ld: CMakeFiles/CardGame.dir/Sources/Rules.cpp.o: 在函数Rules::getRanks[abi:cxx11]()': /home/bartosz/CLionProjects/CardGame/Sources/Rules.cpp:16: undefined reference toRules::ranks[abi:cxx11]' collect2:错误:ld 返回 1 个退出状态

但我相信静态成员(suitsranks)已经正确初始化,那么为什么编译器看不到这个变量呢?

我的代码:

Rules.h

#ifndef CARDGAME_RULES_H
#define CARDGAME_RULES_H

#include <string>

class Rules {
public:
    static std::string suits[4];
    static std::string ranks[13];

public:
    static std::string * getSuits();
    static std::string * getRanks();
};


#endif //CARDGAME_RULES_H

Rules.cpp

#include "../Headers/Rules.h"

std::string suits[4] = {"Diamonds", "Hearts", "Spades", "Clubs"};
std::string ranks[13] = {"2","3","4","5","6","7","8","9","10","J","Q","K","A"};


std::string * Rules::getSuits() {
    return suits;
}

std::string * Rules::getRanks() {
    return ranks;
}

甲板.h

#ifndef CARDGAME_DECK_H
#define CARDGAME_DECK_H


#include "Card.h"

class Deck {
private:
    Card * cards;
    Deck();

public:
    static void createDeck();
    void shuffle();
    void dealCards();
};


#endif //CARDGAME_DECK_H

Deck.cpp

#include "../Headers/Deck.h"
#include "../Headers/Rules.h"

Deck::Deck() {

}

void Deck::createDeck() {
    std::string * ranks = Rules::getRanks();
    std::string * suits = Rules::getSuits();
    // some operations
}

void Deck::shuffle() {

}

void Deck::dealCards() {

}

【问题讨论】:

    标签: c++ oop static


    【解决方案1】:

    Rules.cpp 中,您没有定义静态成员Rules::suitsRules::ranks,而是引入了2 个新的全局变量。

    为了使静态定义起作用,您需要指定完全限定名称,例如Rules::suits

    【讨论】:

    • 像这样:std::string Rules::suits[4] = {"Diamonds", "Hearts", "Spades", "Clubs"}; std::string Rules::ranks[13] = {"2","3","4","5","6","7","8","9","10","J","Q","K","A"}; 对吗?
    【解决方案2】:

    使用常量表达式constexpr

    在头文件Rules.h文件中:

    constexpr std::array<std::string_view, 4> suits = {"Diamonds", "Hearts", "Spades", "Clubs"}; 
    

    【讨论】:

      猜你喜欢
      • 2014-02-17
      • 2021-07-10
      相关资源
      最近更新 更多