为引用成员变量提供默认值
Giving default values to reference member variables
所以我用 c++ 创建了一个类,它有 2 个引用类型成员:
class Edge{
private:
const Node& base;
const Node& target;
public:
Edge(const Node& new1, const Node& new2);
我想在 C'tor 中为基地和目标提供默认值。这意味着:
Edge()
不会是错误,但会创建一个 Edge 对象。我该怎么做?
编辑:我也在尝试:
Edge::Edge(const Node& newBase, const Node& newTarg)
{
m_base=newBase;
m_target=newTarg;
}
但它不会让我,它说没有运算符"="匹配这个运算符。但我确实为节点制作了一个"="运算符并检查它是否有效......
您可以
像任何其他参数一样提供new1
和new2
默认值。诀窍在于,由于它们是通过引用传递的,并且(大概)您正在使用它们来设置base
并target
它们需要足够长的寿命才能有意义。您可以通过制作一个静态的"虚拟"Node
作为未指定默认值来做到这一点,例如:
class Node {};
class Edge{
private:
static const Node none;
const Node& base;
const Node& target;
public:
Edge(const Node& new1=none, const Node& new2=none) : base(new1), target(new2) {}
};
const Node Edge::none;
int main() {
Edge e;
}
不过,这是否是好的设计是另一个问题。对于您尝试解决的潜在问题,很可能有一个更智能的解决方案。
这是一个也适用于
非常量引用的版本:
struct Bar { /* ... */ }:
struct Foo
{
Foo(Bar & br) : b(br) { }
Foo() : b(default_bar) { }
private:
static Bar default_bar;
Bar & b;
};
Bar Foo::default_bar;
这样,所有默认构造的Foo
实例都包含对公共静态default_bar
对象的引用。
另一种解决方案是使用可复制的包装器
struct Reference
{
T* r_noncopyable_object;
};
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- Makefile g++ 使用命令行中的 -D 变量进行编译,默认值
- 变量始终在函数中重置为默认值
- 为什么 std::move 不将默认移动构造函数中的源变量更改为默认值?
- 如果输入类型与目标类型不同,"cin"变量是否重置为某个默认值?
- C++中未初始化成员布尔变量的默认值是多少?
- char指针或char变量的默认值是多少
- const变量是否可以在具有默认值的参数中赋值(作为可选参数)
- 变量不能在 lambda 中隐式捕获,并且没有使用 switch 语句指定捕获默认值
- 从不使用 C/C++ 默认值/分配给变量的值
- 模板类专业化具有成员变量和方法的默认值
- 使用Boost Spirit将默认值分配给变量
- 如何将结构变量初始化为默认值
- 为构造函数初始化引用实例变量提供默认值
- 是初始化为其默认值的外部变量
- 变量始终具有默认值,而不是我计算的值
- 是否可以将`constexpr`模板变量作为正式模板参数的默认值
- 如何使用命名变量定义常量右值引用参数的默认值
- enum变量的默认值是什么
- 创建模板参数的默认值变量