所以我在c ++中创建了一个有2个引用类型成员的类:
class Edge{
private:
const Node& base;
const Node& target;
public:
Edge(const Node& new1, const Node& new2);
我想在C'tor中给出base和target的默认值。这意味着:
Edge()
不会出错,但会创建一个Edge对象。我该怎么做?
编辑: 我也想做:
Edge::Edge(const Node& newBase, const Node& newTarg)
{
m_base=newBase;
m_target=newTarg;
}
但它不会让我,它说没有运营商“=”匹配这些运营商。但我确实为节点创建了一个“=”运算符并检查它是否有效.......
答案 0 :(得分:5)
您可以像任何其他参数一样提供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;
}
如果这是好的设计或不是另一个问题。对于您试图解决的潜在问题,可能会有一个更智能的解决方案。
答案 1 :(得分:2)
这是一个适用于非常量引用的版本:
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
对象的引用。
答案 2 :(得分:0)
另一种解决方案是使用可复制的包装器
struct Reference
{
T* r_noncopyable_object;
};