为什么在实现单例类时会出现“未定义的引用错误”?

时间:2016-04-12 19:39:45

标签: c++ singleton

我正在尝试实现一个方法,该方法返回一个类的实例,但它在第一次尝试创建实例时崩溃了。我不知道如何在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();
}

Carro.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

3 个答案:

答案 0 :(得分:7)

您缺少定义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;

或参考vesion

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

答案 1 :(得分:1)

这两行不正确:

Carta* nueva;
nueva->getInstance();

nueva未初始化为任何内容,因此在下一行中引用它会导致未定义的行为。

您打算做的事情如下:

Carta* nueva = Carta::getInstance();

答案 2 :(得分:0)

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

这是不正确的。这些代码行正好对计算机说:

1. Carta* nueva制作一个指向Carta变量名nueva的指针。别忘了,此时指针为NULL。

2. nueva->getInstance()这意味着访问nueva指针(仍为null)并获取方法getInstance()。因为getInstance是一个静态函数,所以它应该以这种方式使用Carta::getInstance();你必须使用类而不是变量和operator ::来访问静态成员。把它放在你的变量nueva之后所以它会给出这个: nueva = Carta::getInstance();

所以正确的写作将是:

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