我正在尝试制作一个简单的游戏引擎。我之前从未使用过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];
}
...
感谢您的帮助。
答案 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#中永远不会成为问题: