假设我只想要一个将指针作为参数,取消引用它,然后使其等于新实例化的类的函数。
例如:
class MyClass {
MyClass(int v) {value = v;}
int value;
}
Set_New_Class(MyClass *x) {
*x = *( new MyClass(1) ); // Messy!!
}
困扰我的是最后一行......对我而言,这似乎很混乱,事实上,我甚至不确定这是否是正确的做法......
我的方法有什么问题,在c ++中这样做的正确方法是什么?
答案 0 :(得分:4)
像Set_New_Class
这样的函数真的没用。只需创建另一个构造函数,默认情况下将{1}分配给value
:
class MyClass
{
MyClass(int v) : value(v) {}
MyClass() : value(1) {}
int value;
};
然后
MyClass x;
一般来说,会给你我想要的东西。如果先前已定义x
并且您想要重新定义它,那么
x = MyClass();
会这样做。
答案 1 :(得分:3)
您的解决方案的问题在于它使用new
动态创建一个对象,然后从该对象复制,使该对象在以太网中保持不变。也就是说,你有内存泄漏。
相反,您应该只创建一个临时对象并将其分配给您传入的对象:
void Set_New_Class(MyClass *x) {
*x = MyClass(1);
}
然而,raw pointers are usually not the best choice,在这种情况下,我们可以使用引用类型:
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);
答案 2 :(得分:2)
C ++中的指针按值传递。因此,如果要以这种方式分配指针,则需要将指针传递给该指针:
void Set_New_Class(MyClass **x) {
*x = new MyClass(1);
}
否则在函数之外,它仍将保留其旧值。
注释提到的一个注意事项是,以这种方式替换先前的值会导致内存泄漏,应该一起避免这种方法。
答案 3 :(得分:0)
如果您的编译器支持C ++ 11,您可以利用智能指针,特别是unique_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;
}
这样您就不必担心删除已分配的内存和内存泄漏。
答案 4 :(得分:0)
由于通过new分配,您的主要内存泄漏:
*x = *( new MyClass(1) );
您可以使用
解决此问题*x = MyClass(1);
然而,通过引用或指针获取(返回)值仍然是丑陋的。因此,将它留给返回值优化(复制省略)和/或构造函数(r值引用),它变为:
MyClass new_class() { return MyClass(1); }
这很简单有效。
答案 5 :(得分:0)
'new'已经返回一个指针,所以你需要做的就是:
*x = new MyClass(1);