仍然试图回到C++并摸索与Java的差异.
谁能告诉我这里有什么问题?
#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)
#include "Test.h"
Test::Test() {
x = 0;
y = 28;
}
Test::~Test()
{
//dtor
}
Run Code Online (Sandbox Code Playgroud)
#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)
#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)
我究竟做错了什么?我在这里不理解什么?
您new在C++中使用指针.它与Java不同.
你的声明Test test_obj应该是Test* test_obj;
但是,您可以简单地在堆栈上声明变量Test test_obj;.这样做意味着你没有new对象,自动调用构造函数,因此初始化了对象.
要进一步扩展它:
在C++中有两种对象创建方式.
第一个在堆栈上创建一个对象,当对象超出范围时,它会自动销毁(析构函数被调用).
对于第二个,对象是在堆上创建的,你必须显式调用delete对象来销毁它,如下所示:
delete test_obj;
Run Code Online (Sandbox Code Playgroud)
请记住,C++中没有自动内存管理,因此,您必须记住delete您创建的所有内容new.