委托构造函数和引用参数
Delegating constructors and reference parameters
我想通过重载为我的类实现几个构造函数。正如我所理解的,按照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) {
}
相关文章:
- 将const引用参数初始化为默认参数会导致悬空引用吗
- 具有常量引用参数的函数模板专用化
- C++:常量引用参数
- 字符串引用参数的效率C++
- 通过非常量引用参数修改常量引用参数
- 如何将指针变量作为引用参数传递?
- C++初始化 std::function 时如何将占位符绑定到引用/引用参数?
- 移动类的成员作为常量引用参数传递
- C++带有适用于左值和右值的引用参数的函数
- constexpr 函数的常量引用参数:gcc/msvc vs clang/icc
- 如何使用类型特征将函数的通用引用参数限制为 r 值引用?
- 委托构造函数和引用参数
- 对 const 引用参数使用默认值会导致崩溃
- 为什么我们不允许将纯引用参数传递给 std::thread,但允许传递原始指针?
- 为什么我需要将默认引用参数定义为 const 以便为其分配一个左值?
- 将非左值作为常量引用参数传递.临时是在本地作用域还是在调用方作用域中创建的?
- 如何强制函数仅接受左值引用参数
- 模板引用参数推断失败C++
- 非类型引用参数可以在运行时修改,这是否意味着模板可以在运行时实例化?
- 将unique_ptr作为引用参数或常量传递unique_ptr引用