声明对象时,如何解决C ++中的C2065错误?

时间:2019-07-05 16:43:22

标签: c++ visual-studio visual-c++

前一段时间,我从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.
    }

3 个答案:

答案 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;