0

我很抱歉问这样一个新手问题。这是我的问题:

MyClass* c = new MyClass("test");
method(c);//error cannot convert MyClass* to MyClass

定义 :

method(MyClass c);

我也应该定义吗?

method(MyClass* c);

我不想复制代码,正确的方法是什么?

4

2 回答 2

2

您显然是一名 Java 程序员!首先,您需要执行以下操作:

MyClass* c = new MyClass("test");

请注意,这c是一个“指向”的指针MyClass——这是必要的,因为new表达式为您提供了一个指向动态分配对象的指针。

现在,要将其传递给带MyClass参数的函数,您需要取消引用指针。也就是说,您将执行以下操作:

method(*c);

请注意,由于该函数采用MyClass值(而不是引用),因此该对象将被复制到您的函数中。里面的MyClass对象method将是您之前分配的对象的副本。参数的类型完全取决于您希望函数执行和传达的内容。相反,如果您想要对对象的引用,以便修改函数内部的对象将修改函数c外部的对象,您需要您的函数接受一个MyClass&参数 - 对MyClass.

如果您要让参数为 type MyClass*,那么您可以简单地执行以下操作:

method(c);

这将为您提供与传递引用类似的语义,因为指针c将被复制到函数中,但指针引用的对象仍将是动态分配的MyClass对象。也就是说,如果在你修改的函数内部*d,指向的对象c也会被修改。

像这样传递原始指针通常不是一个很好的方法。该函数必须明确检查指针是否为空,否则您的程序可能会在某些情况下崩溃。如果您想要传递引用语义,请使用引用类型 - 这就是它们的用途。

但是,最好不要一开始就动态分配MyClass对象。我猜你之所以使用它只是new因为你在 Java 中做了很多。在 C++ 中,new表达式用于动态分配对象。通常,您不想动态分配对象。使用自动存储持续时间创建它是非常好的,您可以这样做:

MyClass c("test");
method(c);

除非您有充分的理由,否则在 C++ 中避免指针和动态分配被认为是非常好的做法。它只会导致您编写更复杂的代码,并为错误和错误留出更多空间。事实上,你给出的代码已经有问题了,因为你没有delete c;. 当您按照我刚才的建议进行操作时,您无需显式删除任何内容,因为对象超出范围时将被销毁。

于 2013-01-16T19:43:11.743 回答
1
MyClass *c = new MyClass("test");

method(*c);

如果您定义了类似的方法,它会起作用method(MyClass c)

但是如果你定义你的方法,比如method(MyClass *c);

那么应该是

MyClass *c = new MyClass("test");
method(c);

这两种选择会产生后果,具体取决于您要对已创建的对象执行的操作。

于 2013-01-16T19:38:08.910 回答