C++:尝试创建实例时出现问题

int*_*tar 1 c++

仍然试图回到C++并摸索与Java的差异.

谁能告诉我这里有什么问题?

Test.h

#ifndef TEST_H
#define TEST_H

class Test {
    public:
        int x, y;
        Test();
        virtual ~Test();
    protected:
    private:
};

#endif // TEST_H
Run Code Online (Sandbox Code Playgroud)

TEST.CPP

#include "Test.h"

Test::Test() {
    x = 0;
    y = 28;
}

Test::~Test()
{
    //dtor
}
Run Code Online (Sandbox Code Playgroud)

我的主要app标题(我正在使用openFrameworks)

#ifndef _TEST_APP
#define _TEST_APP

#include "ofMain.h"
#include "Test.h"

class testApp : public ofBaseApp{

 public:
  void setup();
            [snip]
  Test test_obj;

};

#endif
Run Code Online (Sandbox Code Playgroud)

test_app.cpp

#include "testApp.h"
#include "Test.h"

//--------------------------------------------------------------
void testApp::setup(){
    test_obj = new Test();
}

[snip]
Run Code Online (Sandbox Code Playgroud)

这应该是直截了当的,对吧?定义一个类Test,在test_app.h中声明一个Test类(test_obj)的变量,然后创建一个实例并将其分配给test_app.cpp文件中的该变量.

但是我在分配行中从编译器收到此错误消息:

error: no match for ‘operator=’ in ‘((testApp*)this)->testApp::test_obj = (operator new(12u), (<statement>, ((Test*)<anonymous>)))’
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?我在这里不理解什么?

Aam*_*mir 8

new在C++中使用指针.它与Java不同.

你的声明Test test_obj应该是Test* test_obj;

但是,您可以简单地在堆栈上声明变量Test test_obj;.这样做意味着你没有new对象,自动调用构造函数,因此初始化了对象.

要进一步扩展它:

在C++中有两种对象创建方式.

  1. 测试test_obj;
  2. Test*test_obj = new Test();

第一个在堆栈上创建一个对象,当对象超出范围时,它会自动销毁(析构函数被调用).

对于第二个,对象是在堆上创建的,你必须显式调用delete对象来销毁它,如下所示:

delete test_obj;
Run Code Online (Sandbox Code Playgroud)

请记住,C++中没有自动内存管理,因此,您必须记住delete您创建的所有内容new.