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

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

仍然试图回到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)->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()

    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;