【问题标题】:Why do I get an "Undefined reference error" when implementing a singleton class? [duplicate]为什么在实现单例类时会出现“未定义的引用错误”? [复制]
【发布时间】:2016-04-12 19:39:44
【问题描述】:

我正在尝试实现一个返回类实例的方法,但是当它第一次尝试创建实例时它崩溃了。我不知道如何在 C++/QT 中实现单例

主要

#include <QCoreApplication>
#include "carro.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    Carta* nueva;
    nueva->getInstance();
    nueva->setColor("rojo");
    cout << nueva->getColor() << endl;

    return a.exec();
}

卡罗.h

#ifndef CARRO_H
#define CARRO_H

#include <string>
#include <iostream>

using namespace std;

class Carta{

private:
    string cara; //valor
    string palo; //simbolo
    string color;
    string direccion;

    static Carta* m_instance;

public:
    //constructor
    Carta(){
    }

   static Carta* getInstance(){
       if(!m_instance){
           m_instance = new Carta;
       }
       return m_instance;
    }

    string getDireccion(){
        return direccion;
    }

    void setColor(string pcolor){
        color = pcolor;
    }

    string getColor(){
        return this->color;
    }

    string getPalo(){
        return this->palo;
    }

    string getCara(){
        return this->cara;
    }

    //print
    string print(){
        return (cara + " de " + palo + " Color: "+color);
    }    
};

#endif // CARRO_H

【问题讨论】:

  • 这里的QT完全不相关。

标签: c++ singleton


【解决方案1】:

您缺少定义static Carta* m_instance;,因此出现链接器错误:

    Carta* Carta::m_instance = nullptr;

不过,如果你确定需要单例,我更愿意推荐 this pattern:

static Carta* getInstance() {
    static Carta m_instance;
    return &m_instance;
}

或

static Carta& getInstance() {
    static Carta m_instance;
    return m_instance;
}

同样为了访问单例,你应该有一些类似的代码

Carta* nueva = Carta::getInstance();
nueva->setColor("rojo");
cout << nueva->getColor() << endl;

或参考版本

Carta& nueva = Carta::getInstance();
nueva.setColor("rojo");
cout << nueva.getColor() << endl;

【讨论】:

    【解决方案2】:

    这两行不正确:

    Carta* nueva;
    nueva->getInstance();
    

    nueva 未初始化为任何内容,因此在下一行中将其推迟会导致未定义的行为。

    看起来您打算执行以下操作:

    Carta* nueva = Carta::getInstance();
    

    【讨论】:

    • 没错,但为什么不先修复主要错误呢??
    【解决方案3】:
    Carta* nueva;
    nueva->getInstance();
    nueva->setColor("rojo");
    

    这是不正确的。这几行代码对计算机准确地说:

    1.Carta* nueva 创建一个指向 Carta 变量名 nueva 的指针。不要忘记此时,指针为 NULL。

    2.nueva-&gt;getInstance() 这意味着访问 nueva 指针(仍然为空)并获取方法 getInstance()。由于 getInstance 是一个静态函数,它应该以这种方式使用 Carta::getInstance(); 您必须使用类而不是变量和运算符 :: 来访问静态成员。将其放入变量 nueva 后,它将给出: nueva = Carta::getInstance();

    所以正确的写法是:

    Carta* nueva;
    nueva = Carta::getInstance();
    nueva->setColor("rojo");
    

    【讨论】:

    • 没错,但为什么不先修复主要错误呢??
    • 我看不出你说的是哪个错误?
    • 啊,你说得对,他没有初始化他的指针
    • OP 在他们的问题中暗示的那个:“对Carta::m_instance 的未定义引用”。
    • Undefined reference 从一开始就被提及,getInstance() 不是代码示例的候选对象。但我同意这个问题应该更清楚。
    猜你喜欢
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 2021-02-12
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    相关资源
    最近更新 更多