仍然试图回到C ++并摸索与Java的差异。
谁能告诉我这里有什么问题?
#ifndef TEST_H
#define TEST_H
class Test {
public:
int x, y;
Test();
virtual ~Test();
protected:
private:
};
#endif // TEST_H
#include "Test.h"
Test::Test() {
x = 0;
y = 28;
}
Test::~Test()
{
//dtor
}
#ifndef _TEST_APP
#define _TEST_APP
#include "ofMain.h"
#include "Test.h"
class testApp : public ofBaseApp{
public:
void setup();
[snip]
Test test_obj;
};
#endif
#include "testApp.h"
#include "Test.h"
//--------------------------------------------------------------
void testApp::setup(){
test_obj = new Test();
}
[snip]
这应该是直截了当的,对吧?定义一个类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>)))’
我做错了什么?我在这里不理解什么?
答案 0 :(得分:8)
您在{+ 1}}中使用C ++中的指针。它与Java不同。
您对new
的声明应为Test test_obj
但是,您可以像Test* test_obj;
一样简单地在堆栈上声明变量。这样做意味着你没有Test test_obj;
对象,自动调用构造函数,因此初始化了对象。
稍微扩展一下:
在C ++中有两种对象创建方式。
第一个在堆栈上创建一个对象,当对象超出范围时,它会自动销毁(析构函数被调用)。
对于第二个,对象是在堆上创建的,你必须在对象上显式调用new
来销毁它,如下所示:
delete
请记住,C ++中没有自动内存管理,因此,您必须记住delete test_obj;
使用delete
创建的所有内容。
答案 1 :(得分:1)
Test *p = new Test();
养成使用auto_ptr或shared_ptr或unique_ptr而不是在C ++中使用原始指针的习惯。
答案 2 :(得分:0)
new Test()
返回Test *
,即指针。您无法将其分配给Test
对象。不过,你可以做test_obj = Test();
。
答案 3 :(得分:0)
在test_app.h中,您声明的是Test对象,而不是指向测试对象的指针。因此,在构造函数中,您不需要在堆上创建Test的新实例。您获得的错误意味着您正在尝试将Test *分配给Test类型的变量。
答案 4 :(得分:0)
要解决您的错误,请注意以下一行:
Test test_obj;
应该是:
Test *test_obj;
答案 5 :(得分:0)
应该是:
Test *test_obj;
//...
test_obj = new Test;
// ...
delete test_obj;
或者:
Test test_obj;
然后没有必要释放test_obj
,因为它一旦超出范围就会自动完成。