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