前一段时间,我从Java更改为C ++。一旦尝试编写一些复杂的函数,我就会失败。 我想做一个变量,指向我的类的实例。但是,即使我尝试声明实例,我也会收到此错误...
#include <iostream>
#include "Game.h"
#include <string>
Game instance; // that should be the Instance
class Game
{
public:
Game()
{
instance = this; // here I got the error.
}
答案 0 :(得分:2)
在C ++中,与Java不同,在编写时:
Game instance; // that should be the Instance
您正在创建Game
类型的实际对象。在Java中,这将创建一个handle变量,然后您需要使用new
运算符来实际创建Game
对象。那不是它在C ++中的工作方式。
在源代码行中:
Game()
{
instance = this; // here I got the error.
}
变量this
实际上是指向当前对象的指针。但是instance
不是指针变量,它由Game *instance;
定义,而是实际的Game
对象。将指针值分配给不是指针的对象是编译错误。
对源的一种修改(可能不一定是您真正想要的修改)是进行以下更改:
#include <iostream>
#include "Game.h"
#include <string>
Game *instance; // global that contains a pointer to a Game object, no object created.
class Game
{
public:
Game()
{
instance = this; // we are creating an object of class Game now assign it to our global.
}
}
但是,这在C ++中并没有真正意义。对于多个Game
对象,可以多次调用该构造函数。
假定头文件Game.h包含类定义,如果您只想创建Game
的单个实例,那么最简单的方法是将其编写为:
#include <iostream>
#include "Game.h"
#include <string>
Game instance; // the global Game object that is created as part of the application starting up.
但是,如果您想使用singleton design pattern创建一个实例,这将强制创建一个并且只有一个这样的对象,则您需要做一些额外的工作,这需要对C ++有更深入的了解和班级建设。
答案 1 :(得分:0)
问题的原因是,“ this”是c ++中的指针,而不是Java中对对象的引用,因此必须取消引用它才能将其分配给对象:
instance = *this;
请注意,尽管这样做会复制您的对象。尽管这是您可以做到的方式,但我想说,一般不建议使用全局变量和单例。我建议您使用静态类。有关该外观的讨论,here。总结:不必使用单例。
答案 2 :(得分:0)
您应将实例声明为指向Game的指针:
Game *instance = NULL;