gpt4 book ai didi

c++ - 如何在构造函数中处理 'this' 指针?

转载 作者:IT老高 更新时间:2023-10-28 22:01:32 29 4
gpt4 key购买 nike

我有在其构造函数中创建其他子对象的对象,传递“this”以便子对象可以将指针保存回其父对象。我在编程中广泛使用 boost::shared_ptr 作为 std::auto_ptr 或原始指针的更安全替代方案。所以 child 会有 shared_ptr<Parent> 这样的代码, 而 boost 提供了 shared_from_this() parent 可以给 child 的方法。

我的问题是 shared_from_this()不能在构造函数中使用,这并不是犯罪,因为无论如何都不应该在构造函数中使用“this”,除非您知道自己在做什么并且不介意限制。

Google 的 C++ 风格指南 states构造函数应该只将成员变量设置为其初始值。任何复杂的初始化都应该在显式的 Init() 方法中进行。这解决了“this-in-constructor”问题以及其他一些问题。

困扰我的是,现在使用您的代码的人必须记住每次构造您的对象时都调用 Init()。我能想到的唯一方法是通过断言 Init() 已经在每个成员函数的顶部被调用,但这写起来很乏味,执行起来也很麻烦。

在此过程中的任何步骤中是否有任何成语可以解决此问题?

最佳答案

使用工厂方法两阶段构造和初始化您的类,然后将 ctor 和 Init() 函数设为私有(private)。那么就没有办法错误地创建你的对象。只要记住保持析构函数是公开的并使用智能指针:

#include <memory>

class BigObject
{
public:
static std::tr1::shared_ptr<BigObject> Create(int someParam)
{
std::tr1::shared_ptr<BigObject> ret(new BigObject(someParam));
ret->Init();
return ret;
}

private:
bool Init()
{
// do something to init
return true;
}

BigObject(int para)
{
}

BigObject() {}

};


int main()
{
std::tr1::shared_ptr<BigObject> obj = BigObject::Create(42);
return 0;
}

编辑:

如果你想让对象存在于堆栈中,你可以使用上述模式的变体。正如所写,这将创建一个临时并使用复制ctor:

#include <memory>

class StackObject
{
public:
StackObject(const StackObject& rhs)
: n_(rhs.n_)
{
}

static StackObject Create(int val)
{
StackObject ret(val);
ret.Init();
return ret;
}
private:
int n_;
StackObject(int n = 0) : n_(n) {};
bool Init() { return true; }
};

int main()
{
StackObject sObj = StackObject::Create(42);
return 0;
}

关于c++ - 如何在构造函数中处理 'this' 指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2510521/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com