当前位置:  开发笔记 > 编程语言 > 正文

清空C++对象

如何解决《清空C++对象》经验,为你挑选了4个好方法。

我经常Empty向C++对象添加一个方法,以使用类似于以下的代码清除内部状态.

class Foo
{
private:
    int n_;
    std::string str_;
public:
    Foo() : n_(1234), str_("Hello, world!")
    {
    }

    void Empty()
    {
        *this = Foo();
    }
};

这似乎比在构造函数中复制代码更好,但我想知道*this = Foo()在想要清除对象时是否是一种常见的方法?这有什么问题等着咬我的背面?有没有其他更好的方法来实现这种事情?



1> Ates Goral..:

我让构造函数调用我的函数:

class Foo
{
private:
    int n_;
    std::string str_;
public:
    Foo()
    {
        Reset();
    }

    void Reset()
    {
        n_ = 1234;
        str_ = "Hello, world!";
    }
};

是的,您首先将字符串初始化为空字符串,然后进行分配,但这更加清晰.



2> 小智..:

潜在问题?你怎么知道*这真的是一个Foo?



3> Paulius..:

你使用这个Empty方法做的事情与将新构造的对象手动分配给变量(Empty函数所做的事情)基本相同.

就个人而言,我将删除Empty方法,并用以下方法替换该方法的所有用法:

// let's say, that you have variables foo and pfoo - they are properly initialized.
Foo foo, *pfoo;

// replace line "foo.Empty()" with:
foo = Foo();

// replace line "pfoo->Empty()" with:
delete pfoo;
pfoo = new Foo();
// or
*pfoo = Foo();

我觉得这个Empty方法没有任何优势.它隐藏了被称为女巫的对象真正发生的事情,这个名字也不是最好的选择.

如果调用者真的想要一个干净的对象 - 他自己构建对象没有问题.



4> Johann Gerel..:

另外,考虑使对象不可变,,在构造时,它们不能被改变.在很多场景中,这可以避免意外的副作用.

推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有