委托构造函数和引用参数

Delegating constructors and reference parameters

本文关键字:引用 参数 构造函数      更新时间:2023-10-16

我想通过重载为我的类实现几个构造函数。正如我所理解的,按照DRY原则,实现这一点的惯用方法是使用一种称为委派构造函数的特性。我还看到了在任何地方使用引用参数和不惜一切代价避免指针的想法,因为引用是一种c++方式等。

因此,我认为这可以通过指针来实现(有效(:

class B {};
class C {};
class A {
public:
A();
A(const B* b);
A(const B* b, const C* c);
private:
const B* b_;
const C* c_;
};
// These ctors short and concise, delegating work to last ctor
A::A() : A(nullptr, nullptr) {}
A::A(const B* b) : A(b, nullptr) {}
// This ctor contains code that deals with b or c being nullptr
// Ideally I only modify code in this ctor (DRY)
A::A(const B* b, const C* c) : b_(b), c_(c) { 
//code
}

下面的显然不起作用:

class B {};
class C {};
class A {
public:
A();
A(const B& b);
A(const B& b, const C& c);
private:
const B& b_;
const C& c_;
};
A::A() : A(nullptr, nullptr) {}
A::A(const B& b) : A(b, nullptr) {}
A::A(const B& b, const C& c) : b_(b), c_(c) {
//code
}

因此,问题是如何按照指针示例中的语义实现委托构造函数,但将引用作为构造函数的参数。

(我在某个地方完全没有抓住要点吗?也许甚至只是盯着整体想法看?(

不能将nullptr传递给引用。它的存在正是为了这个目的。

指针是包含变量地址的变量。引用是地址变量,因此它不能引用任何内容,也不能重新分配。

当你写

A(const B& b)

你正在签订合同。你在说:"我想用一个强制性的B对象构造A。B为空不是一个选项。">

委托给该建造商意味着遵守其合同。因此,在这种假设下,您的代表团可以很好地处理:

struct B{};
struct A{
A() : A(B{}){}  // Constructing a pre-defined B object
A(const B& b) : _b{b}{}
B _b;  
};

int main ()
{
A a;
}

此处的实时代码

也就是说,如果你想表达一个可以为null的类型,如果C++17是一个选项,你可以使用std::optional。如果您有多态对象,我建议使用智能指针来更好地表达所有权,并对代码有更多的控制权。

假设"A"的成员是引用,允许这样做的一种方法是为每个类都有一些特殊的"null"值:

class B {};
class C {};
class A
{
public:
A();
A(const B& b);
A(const B& b, const C& c);
private:
const B& b_;
const C& c_;
static const B null_b;
static const C null_c;
};
A::A() : A(null_b, null_c) {}
A::A(const B& b) : A(b, null_c) {}
A::A(const B& b, const C& c) : b_(b), c_(c) {
}