【问题标题】:C++ class members and RAII, values, raw pointers or smart pointers? [closed]C++ 类成员和 RAII、值、原始指针还是智能指针? [关闭]
【发布时间】:2020-11-18 20:30:38
【问题描述】:

好的,试着写一段和我的实际情况比较相似的代码,请以它为例,它不必编译:

class A
{
    public:

    A() = delete;
    A(int value);
    ...
}

class B
{
    unique_ptr<A> a;
    C c;

    B() { a = make_unique<A>(c.getValue()); }
}

class C
{
    public:

    C();
    int getValue() { return <an int value based on something>; }
}

现在我希望我的问题更清楚,因为一些限制我不能将 int 值传递给 B 构造函数,然后我不能使用初始化列表。那么,我的 unique_ptr 解决方案是首选方案吗?再次感谢。

【问题讨论】:

  • 您更好的 C++ 解决方案无法编译,因为 args 未声明。
  • 除了std::unique_ptr&lt;T&gt;,还要考虑std::optional&lt;T&gt;,它将T放在自身内部,而不是堆上。
  • 如果B 知道args(如指针变体中所建议的那样),那么您正在寻找member initializer list。不需要指针或选项。
  • 我第二个 Yksisarvinen。在我看来,您的整个困境都基于在您的 c'tor 主体中使用赋值而不是初始化的习惯。这是a habit worth breaking。
  • 请编辑以提供有关您的特定用例的更多详细信息。目前还不清楚,为什么你认为你需要一个默认的构造函数并在以后“初始化”。

标签: c++ class smart-pointers member raii


【解决方案1】:

智能指针版本当然比裸版本更好,但我不相信首先需要动态分配或指针。我建议不要默认初始化 A:

struct A
{
    A() = delete;
    A(args);
};

struct B
{
    A a {args{}};
};

【讨论】:

    【解决方案2】:

    没有什么能阻止你做事

    class A
    {
        A() = delete;
    public:
        A(Args);
        // more members...
    }
    
    class B
    {
        A a;
    
    public:
        // if B has sensible defaults for args
        B() : a(default_args /*some default args*/) {} 
        // otherwise
        B(Args args) : a(args) {}
    }
    

    【讨论】:

      猜你喜欢
      • 2015-10-01
      • 1970-01-01
      • 2010-09-28
      • 2016-04-12
      • 1970-01-01
      • 1970-01-01
      • 2016-08-01
      • 1970-01-01
      • 2015-01-24
      相关资源
      最近更新 更多