类的奇怪问题

时间:2009-09-02 21:34:15

标签: c++ oop class

我正在尝试制作一个简单的游戏引擎。我之前从未使用过OOP,所以这可能是一个简单的错误,但是在尝试创建类的实例时我遇到了这个错误。

invalid conversion from `World*' to `int'
initializing argument 1 of `World::World(int)'

这是创建类的代码。

  World w = new World(100);

实际班级:

class World {
    int maxParts;
    public:
        GameObject **parts;
        World(int maxParts);
        int addObject(int type);
    private:
        int firstFreeId();
};

World::World(int maxParts)
{
    parts = new GameObject *[maxParts];
}

...

感谢您的帮助。

6 个答案:

答案 0 :(得分:13)

new World(100)动态创建一个新的World对象,将100传递给构造函数,但求值为指针到创建的对象。

如果您只想构建一个World对象,则不需要new表达式,您可以直接构造它:

World w(100);

您得到的错误是因为您尝试根据World表达式返回的World指针构造new对象。唯一的World构造函数采用int,如果没有显式强制转换,则无法将指针类型转换为int

答案 1 :(得分:7)

new运算符返回一个指针:

World *w = new World(100);

以这种方式创建World对象后,您通常会使用->运算符访问它:

w->addObject(5);

当你完成它之后,不要忘记delete它或你会有内存泄漏:

delete w;
w = NULL;

设置w = NULL并非绝对必要,但这是一种很好的做法,因为它可以防止您在删除对象后意外访问该对象。

答案 2 :(得分:5)

你在这里错过了一个星号:

World *w = new World(100);

当您使用new创建内容时,它会为您提供指向新对象的指针,因此您将指针放入的变量必须使用星号声明。

答案 3 :(得分:3)

您还需要一个析构函数来清理指针数组。

World::~World()
{
    delete[] parts;
}

注意删除数组时的不同删除形式 - 这很关键。

或者你可以使用std::vector<GameObject*>,你不必担心它。

答案 4 :(得分:1)

World w = foo;使用参数foo调用World的构造函数(除非foo已经是World对象),然后调用World的复制构造函数,并将结果作为参数。 new World(foo)使用参数foo调用World的构造函数,将结果存储在堆上并返回指向该值的指针。

所以World w = new World(100)首先在堆上创建一个World对象,用arguemnt 100调用构造函数。然后再次调用构造函数,结果为new World(100)作为参数(因为{{1}使用foo作为参数调用构造函数),这不起作用,因为构造函数不接受World w = foo类型的参数。

答案 5 :(得分:0)

我强烈建议先用C#或java代替C ++来学习OOP。

由于这是消极的,我已经编辑了回复。我并不想让自己变得讨厌。我的建议就是为什么:

首先,我喜欢戴夫·辛顿的理由(感谢你的报应),这里还有更多:

我认为如果您使用.net或Java sdk,您将拥有更多开箱即用的库和对象。我知道C ++中存在很多,但我认为有点难以获取和拼凑。当然,我说的是比STL更高级别的对象。例如在.net中,我可以使用称为“MailMessage”的东西来构建电子邮件。这些天我用Gcc和C ++不知道如何做到这一点。我想这里的重点是Java或C#的框架支持与C ++(非.net C ++)的框架支持。

接下来,我认为在java和C#中名称空间有点更容易虽然我知道这可能会得到抨击。

最重要的是,如果你看一下建议的答案(并且它们是正确的吗?),你会注意到它们在Java或C#中永远不会成为问题:

  1. 缺少星号
  2. 混淆(对初学者来说,至少对我而言)是'。'和' - &gt;'