【问题标题】:G++: "Undefined Reference to" error [duplicate]G ++:“未定义的引用”错误[重复]
【发布时间】:2015-09-26 13:59:34
【问题描述】:

注意:我知道这里有很多与此类似的问题,但我已经全部查看了,但无济于事。

所以,我有一个简单的单例 GameManager 类,分为 .h.cpp 文件。

GameManager.h

#ifndef _GM_H_
#define _GM_H_

#include <iostream>
/**
 * Singleton GameManager class.
 *
 **/
class GameManager {

    //Private Variables
    private:
        static GameManager* _instance;
        int _gameObjects;

    //Private Methods
    private:
        GameManager();
        ~GameManager();

    //Public Methods and Functions
    public:
        static GameManager* instance()
        {
            if (!_instance) 
                _instance = new GameManager();

            return _instance;
        }

        //Placeholders
        void addObject();
        int getObjects();
};

#endif

GameManager.cpp

#include "GameManager.h"
#include <iostream>


GameManager::GameManager()
{
    _gameObjects = 0 ;
}

void GameManager::addObject()
{
    _gameObjects += 1;
}

int GameManager::getObjects()
{
    return _gameObjects;
}

main.cpp

#include "GameManager.h"

#include <iostream>
#include <string>



int main(int argc, char** argv)
{

    GameManager::instance();
    GameManager::instance()->addObject();
    std::cout << GameManager::instance()->getObjects() << std::endl;

    return 0;
}

当我尝试使用

编译它时
g++ main.cpp GameManager.cpp

我得到了错误

/tmp/cctNvscU.o: In function `GameManager::instance()':
main.cpp:(.text._ZN11GameManager8instanceEv[_ZN11GameManager8instanceEv]+0x9): undefined reference to `GameManager::_instance'
main.cpp:(.text._ZN11GameManager8instanceEv[_ZN11GameManager8instanceEv]+0x29): undefined reference to `GameManager::_instance'
main.cpp:(.text._ZN11GameManager8instanceEv[_ZN11GameManager8instanceEv]+0x2e): undefined reference to `GameManager::_instance'
collect2: error: ld returned 1 exit status

感谢任何帮助。提前致谢。

【问题讨论】:

标签: c++ linker g++


【解决方案1】:
    static GameManager* _instance;

这声明了一个GameManager* 类型的静态变量。现在它驻留在一个头文件中(它本身没有编译),它只是一个声明:“一个名为 _instance 类型为 GameManager* 的全局变量确实存在”。

但是分配给_instance 的空间在哪里呢?它是一个静态变量,因此它不附加到对象的特定实例,它必须驻留在最终二进制文件中的某个位置。

为了能够使用_instance,您必须在翻译单元内为其提供静态空间。所以你必须在源文件中定义变量(它是编译的,不像头文件)。

解决方案就是在一个 .cpp 中(可能是GameManager.cpp):

GameManager* GameManager::_instance = nullptr;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-28
    • 2013-03-06
    • 1970-01-01
    • 2020-02-03
    • 2013-11-08
    • 2016-12-09
    • 2012-12-05
    • 1970-01-01
    相关资源
    最近更新 更多