我有一个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)) {}
}
(在“现实生活”中,
Foo
和Bar
更加复杂。Bar
是Foo
的 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
提供一个包装,该包装提供一个默认构造函数,该构造函数负责初始化新实例。请注意,在您的示例中,您没有按照声明成员的顺序来初始化成员。成员将按照声明的顺序进行初始化,无论您如何在初始化列表中对其进行排序。