C++ C++;:尝试创建实例时出现问题
仍然试图回到C++中,并从java中找出差异。 谁能告诉我这里怎么了 测试h Test.cpp 我的主应用程序标题(我正在使用openFrameworks) test_app.cpp 这应该很简单,对吗?定义一个类测试,在Test_app.h中声明一个类测试变量(Test_obj),然后在Test_app.cpp文件中创建一个实例并将其分配给该变量 但是,我从编译器的赋值行中收到以下错误消息:C++ C++;:尝试创建实例时出现问题,c++,C++,仍然试图回到C++中,并从java中找出差异。 谁能告诉我这里怎么了 测试h Test.cpp 我的主应用程序标题(我正在使用openFrameworks) test_app.cpp 这应该很简单,对吗?定义一个类测试,在Test_app.h中声明一个类测试变量(Test_obj),然后在Test_app.cpp文件中创建一个实例并将其分配给该变量 但是,我从编译器的赋值行中收到以下错误消息: error: no match for ‘operator=’ in ‘((testApp*)this
error: no match for ‘operator=’ in ‘((testApp*)this)->testApp::test_obj = (operator new(12u), (<statement>, ((Test*)<anonymous>)))’
error:this中的“operator=”不匹配-->testApp::test_obj=(operator new(12u),(,((test*))”
我做错了什么?我在这里不理解什么? 你在C++中用<指针> < <代码> >指针。它不同于Java 您的
Test-Test\u-obj
声明应为Test*Test\u-obj代码>
然而,您可以简单地在堆栈上声明变量,如Test\u obj代码>。这样做意味着您不必new
对象,构造函数将自动调用,因此对象将被初始化
要进一步扩展它:
< C++ >对象创建有两种方式:
测试对象李>
Test*Test_obj=新测试()李>
第一种方法是在堆栈上创建一个对象,当对象超出范围时,它会自动销毁(调用析构函数)
对于第二个,对象是在堆上创建的,您必须显式调用对象上的delete
,以如下方式销毁它:
delete test_obj;
<>记住,C++中没有自动内存管理,因此,你必须记住,用<代码> < <新代码> > > < /p> < p>你使用C++中的指针使用<代码>新< /代码>。它不同于Java
您的Test-Test\u-obj
声明应为Test*Test\u-obj代码>
然而,您可以简单地在堆栈上声明变量,如Test\u obj代码>。这样做意味着您不必new
对象,构造函数将自动调用,因此对象将被初始化
要进一步扩展它:
< C++ >对象创建有两种方式:
测试对象李>
Test*Test_obj=新测试()李>
第一种方法是在堆栈上创建一个对象,当对象超出范围时,它会自动销毁(调用析构函数)
对于第二个,对象是在堆上创建的,您必须显式调用对象上的delete
,以如下方式销毁它:
delete test_obj;
<>记住,C++中没有自动内存管理,因此,你必须记住,用<代码> > < <代码> >创建.> < /p> < p> <代码>新的测试(<)>代码>返回<代码>测试*>代码>,即指针。您不能将其分配给测试
对象。你可以做test\u obj=test()但是,code>。newtest()
返回一个Test*
,即指针。您不能将其分配给测试
对象。你可以做test\u obj=test()但是,代码>。在test\u app.h中,您正在声明一个测试对象,而不是指向测试对象的指针。因此,在构造函数中,不需要在堆上创建新的Test实例。您收到的错误意味着您正试图将测试*分配给测试类型的变量。在您的测试应用程序.h中,您正在声明一个测试对象,而不是指向测试对象的指针。因此,在构造函数中,不需要在堆上创建新的Test实例。您得到的错误意味着您正试图将测试*分配给测试类型的变量
Test *p = new Test();
<> >使用C++中的原始指针或使用原始指针的习惯。
<> >使用C++中的生词指针或使用或不使用原始指针来修复错误,这行:
Test test_obj;
应该是:
Test *test_obj;
要修复错误,请执行以下操作:
Test test_obj;
应该是:
Test *test_obj;
它应该是:
Test *test_obj;
//...
test_obj = new Test;
// ...
delete test_obj;
或:
那么就不需要发布test\u obj
,因为一旦它超出范围就会自动完成。它应该是:
Test *test_obj;
//...
test_obj = new Test;
// ...
delete test_obj;
或:
那么就不需要发布test\u obj
,因为一旦超出范围,它就会自动完成。+1。这样做,当对象超出作用域时,它也会自动被释放。也许是吹毛求疵,但C++中有自动内存管理:正如您所说,当对象超出作用域时,会自动调用析构函数。更公平地说,堆对象没有自动垃圾收集,这就是为什么人们应该为它们使用unique\u ptr
和shared\u ptr
(这样做时,你不必删除用new
创建的所有内容)。@beldaz:好的一点,但对于一个非常基础的人来说,我想保持简单:)@interstar:因为您来自Java,现在已经习惯使用GC,请阅读并查看。+1。这样做,当对象超出作用域时,它也会自动被释放。也许是吹毛求疵,但C++中有自动内存管理:正如您所说,当对象超出作用域时,会自动调用析构函数。更公平地说,堆对象没有自动垃圾收集,这就是为什么人们应该为它们使用unique\u ptr
和shared\u ptr
(这样做时,你不必删除用new
创建的所有内容)。@beldaz:好的一点,但对于一个非常基础的人来说,我想保持简单:)@interstar:因为您来自Java,现在已经习惯使用GC,所以请仔细阅读,然后检查。注意您的标题保护,以下划线开头,后跟大写字符的标识符是保留的,不应该在应用程序代码中使用。是这样吗
Test test_obj;