gpt4 book ai didi

c++ - 为初始化引用实例变量的构造函数提供默认值

转载 作者:行者123 更新时间:2023-11-30 02:27:07 25 4
gpt4 key购买 nike

我有一个 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 提供包装器它提供了一个负责初始化新实例的默认构造函数。

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

关于c++ - 为初始化引用实例变量的构造函数提供默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42098038/

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