C++ C++;尊重的正确方式并为指针赋值
比方说,我只需要一个函数,它将指针作为参数,取消引用它,然后使它等于一个新实例化的类 例如:C++ C++;尊重的正确方式并为指针赋值,c++,pointers,C++,Pointers,比方说,我只需要一个函数,它将指针作为参数,取消引用它,然后使它等于一个新实例化的类 例如: class MyClass { MyClass(int v) {value = v;} int value; } Set_New_Class(MyClass *x) { *x = *( new MyClass(1) ); // Messy!! } 使我烦恼的是最后一行。。对我来说,这看起来很混乱,事实上,我甚至不确定这是否是正确的方法 P>是否有什么不对的地方
class MyClass {
MyClass(int v) {value = v;}
int value;
}
Set_New_Class(MyClass *x) {
*x = *( new MyClass(1) ); // Messy!!
}
使我烦恼的是最后一行。。对我来说,这看起来很混乱,事实上,我甚至不确定这是否是正确的方法
<> P>是否有什么不对的地方,在C++中正确的方法是什么?< P> C++中的指针是通过值传递的。因此,如果要以这种方式分配指针,则需要向该指针传递一个指针:
void Set_New_Class(MyClass **x) {
*x = new MyClass(1);
}
否则在函数之外,它仍将保留其旧值
注释中提到的一个注意事项是,以这种方式替换以前的值可能会导致内存泄漏,因此应该一起避免这种方法。您的解决方案的问题是,它使用
new
动态创建一个对象,然后从该对象复制,把那个东西留在乙醚里。也就是说,您有内存泄漏
相反,您应该只创建一个临时对象,并将其指定给传入的对象:
void Set_New_Class(MyClass *x) {
*x = MyClass(1);
}
但是,在这种情况下,我们可以使用引用类型:
void Set_New_Class(MyClass& x) {
x = MyClass(1);
}
但是,我发现这样的输出参数通常是不必要的,因此我建议更好的解决方案是实际返回新对象并将其分配给x
外部:
MyClass Get_New_Class() {
return MyClass(1);
}
// Somewhere else:
x = Get_New_Class();
当然,只有当您确实需要做一些复杂的事情来创建新对象时,才需要有一个函数。如果没有,请执行以下操作:
x = MyClass(1);
像
Set\u New\u Class
这样的函数实际上是没有用的。只需创建另一个构造函数,默认情况下,该构造函数将1分配给值
:
class MyClass
{
MyClass(int v) : value(v) {}
MyClass() : value(1) {}
int value;
};
然后
总的来说,我会给你想要的。如果先前定义了x
,您希望重新定义它,则
x = MyClass();
会的。如果您的编译器支持C++11,您可以利用智能指针,尤其是
unique\u ptr
:
#include <iostream>
#include <memory>
class MyClass {
int value;
public:
MyClass(int v) {value = v;}
int getvalue() const { return value; }
};
void Set_New_Class(std::unique_ptr<MyClass> &x) {
x.reset(new MyClass(1)); // safe old memory is deleted
}
int main() {
std::unique_ptr<MyClass> x(new MyClass(2));
std::cout << x->getvalue() << std::endl;
Set_New_Class(x);
std::cout << x->getvalue() << std::endl;
}
#包括
#包括
类MyClass{
int值;
公众:
MyClass(int v){value=v;}
int getvalue()常量{返回值;}
};
无效集\新\类(标准::唯一\ ptr&x){
x、 重置(新MyClass(1));//安全旧内存被删除
}
int main(){
std::unique_ptr x(新MyClass(2));
std::cout getvalue()由于通过新的
*x = *( new MyClass(1) );
你可以用
*x = MyClass(1);
但是,传递一个将获得(返回)值的引用或指针仍然很难看。因此,将其留给返回值优化(复制省略)和/或构造函数(r值引用),它将变成:
MyClass new_class() { return MyClass(1); }
它简单有效。'new'已返回指针,因此您只需执行以下操作:
*x = new MyClass(1);
MyClass&x
和x=MyClass(1)我的方法有什么不对吗?< /代码>内存泄漏。我猜为什么不为函数设置一个返回类型SETXNEXYOLL类?空洞是正确的。默认情况下C++表示是INTING。但是,不定义返回类型不是很好的做法,并且不返回任何东西。function@StephaneRollandC++没有说过这样的话,你就是THIC我不想做一个好的实践。你写一个函数原型的返回类型:句点。无论是C++还是C。不仅如此,而且他们分配了一个<代码>新的MyClass < /代码>,它立即落入范围之外,变得不可达,因此每次都泄漏新对象。被value.hmmm…和x
指向new
之前的内存会发生什么情况?如果OP不处理它,它会泄漏。虽然您的观察是正确的,这是最重要的,但我不会提出这样的解决方案。在没有任何理由证明复杂的情况下,您的解决方案是正确的。这不会编译,请检查类型。
*x = new MyClass(1);