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

时间:2010-11-08 09:02:12

标签: 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

Test.cpp的

#include "Test.h"

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

Test::~Test()
{
    //dtor
}

我的主要应用标题(我正在使用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

test_app.cpp

#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>)))’

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

6 个答案:

答案 0 :(得分:8)

您在{+ 1}}中使用C ++中的指针。它与Java不同。

您对new的声明应为Test test_obj

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

稍微扩展一下:

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

  1. 测试test_obj;
  2. 测试* test_obj = new Test();
  3. 第一个在堆栈上创建一个对象,当对象超出范围时,它会自动销毁(析构函数被调用)。

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

    delete

    请记住,C ++中没有自动内存管理,因此,您必须记住delete test_obj; 使用delete创建的所有内容。

答案 1 :(得分:1)

Test *p = new Test(); 

养成使用auto_ptrshared_ptrunique_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,因为它一旦超出范围就会自动完成。