c++ - 对类的静态成员的 undefined reference

标签 c++ oop static

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

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

/usr/bin/ld: CMakeFiles/CardGame.dir/Sources/Rules.cpp.o: in function 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: in function Rules::getRanks[abi:cxx11]()': /home/bartosz/CLionProjects/CardGame/Sources/Rules.cpp:16: undefined reference toRules::ranks[abi:cxx11]' collect2: error: ld returned 1 exit status

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

我的代码:

规则.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

规则.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

甲板.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() {

}

最佳答案

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

为了使静态定义起作用,您需要指定完全限定名称,例如规则::适合

关于c++ - 对类的静态成员的 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58303156/

相关文章:

nhibernate - 建模一对零或一对关系(Z 基数)

java - 为了保留引用而将嵌套类声明为非静态?

c++ - CPP boost 访客多目标

java - 省略了在 Java 子类中使用构造函数

PHP 面向对象 - 实现多个用户角色的最佳方式

variables - if/else 条件定义变量。未定义 : dat (variable)

c# - 在 C# 中是否有可继承静态泛型类的替代方案?

c++ - 将 LPCWSTR 与另一个字符串组合

c++ - 在 C++ 标准中临时绑定(bind)到成员生命周期语句有什么意义?

c++ - 给定一组点的特征和 SVD 找到最佳拟合平面