我有一个Foo类,该实例具有对Bar的引用作为实例变量。有没有一种方法可以让Foo构造函数之一创建Bar实例(因此Foo类的用户无需自己显式创建Bar对象)?

我想做这样的事情:

class Foo {
  private:
    int size;
    Bar& bar; // shared by other objects
    //several other instance variables

  public:
    Foo(int s, Bar& b) : size(s), bar(b) {}

    // This, of course, doesn't work.  I can't think of an
    // alternative that doesn't require users of Foo to
    // create Bar
    Foo(int s) : size(s), bar(Bar(s)) {}
}

(在“现实生活”中,FooBar更加复杂。BarFoo的 friend ,它只有Foo使用私有(private)构造函数。每个Bar可以由几个Foo共享。这不是主要问题,我是我很好奇它是否可以在没有指针的情况下完成。)

最佳答案

最简单的解决方案是在需要时分配Bar。添加成员std::unique_ptr<Bar>是实现此目的的最简单方法。我无法构想一个解决您的问题的系统,该系统不会为您的类(class)增加一些内存开销。即使不需要,您也必须考虑存储Bar,或者必须考虑某种状态来进行跟踪,而不是对Bar进行内部管理。使用unique_ptr会增加指向您的类的指针的大小。

#include <memory>

class Foo {
private:
    std::unique_ptr<Bar> storage;
    Bar& bar;
    int size;

public:
    Foo(int s, Bar& b) : bar(b), size(s) {}
    Foo(int s) : storage(std::make_unique<Bar>(s)), bar(*storage), size(s) {}
};

一个更精细的解决方案是为Bar提供一个包装,该包装提供一个默认构造函数,该构造函数负责初始化新实例。

请注意,在您的示例中,您没有按照声明成员的顺序来初始化成员。成员将按照声明的顺序进行初始化,无论您如何在初始化列表中对其进行排序。

07-26 00:18
查看更多