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);