我很抱歉问这样一个新手问题。这是我的问题:
MyClass* c = new MyClass("test");
method(c);//error cannot convert MyClass* to MyClass
定义 :
method(MyClass c);
我也应该定义吗?
method(MyClass* c);
我不想复制代码,正确的方法是什么?
我很抱歉问这样一个新手问题。这是我的问题:
MyClass* c = new MyClass("test");
method(c);//error cannot convert MyClass* to MyClass
定义 :
method(MyClass c);
我也应该定义吗?
method(MyClass* c);
我不想复制代码,正确的方法是什么?
您显然是一名 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;
. 当您按照我刚才的建议进行操作时,您无需显式删除任何内容,因为对象超出范围时将被销毁。
MyClass *c = new MyClass("test");
method(*c);
如果您定义了类似的方法,它会起作用method(MyClass c)
但是如果你定义你的方法,比如method(MyClass *c);
那么应该是
MyClass *c = new MyClass("test");
method(c);
这两种选择会产生后果,具体取决于您要对已创建的对象执行的操作。