为引用成员变量提供默认值 我在C++中做了一个类,它有2个引用类型成员: class Edge{ private: const Node& base; const Node& target; public: Edge(const Node& new1, const Node& new2);

为引用成员变量提供默认值 我在C++中做了一个类,它有2个引用类型成员: class Edge{ private: const Node& base; const Node& target; public: Edge(const Node& new1, const Node& new2);,c++,class,reference,constructor,object-lifetime,C++,Class,Reference,Constructor,Object Lifetime,我想给C'tor中的base和target指定默认值。这意味着: Edge() 不会出错,但会创建边对象。我该怎么做 编辑: 我也在努力做到: Edge::Edge(const Node& newBase, const Node& newTarg) { m_base=newBase; m_target=newTarg; } 但它不允许我,它说没有操作符=匹配这个操作符。但我确实为节点做了一个=操作符,并检查了它是否有效……您可以像任何其他参数一样为new1和n

我想给C'tor中的base和target指定默认值。这意味着:

Edge()
不会出错,但会创建边对象。我该怎么做

编辑: 我也在努力做到:

Edge::Edge(const Node& newBase, const Node& newTarg)
{
    m_base=newBase;
    m_target=newTarg;
}
但它不允许我,它说没有操作符=匹配这个操作符。但我确实为节点做了一个=操作符,并检查了它是否有效……

您可以像任何其他参数一样为new1和new2提供默认值。诀窍在于,由于它们是通过引用传递的,并且假设您正在使用它们来设置基础和目标,因此它们需要足够长的寿命才能使其有意义。您可以通过将静态虚拟节点用作未指定的默认节点来实现此目的,例如:

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实例都包含对公共静态默认对象的引用。

另一种解决方案是使用可复制的包装

struct Reference
    {
    T* r_noncopyable_object;
    };

你试过什么?你知道如何为函数编写默认参数吗?@KerrekSB:添加默认参数并没有真正的帮助。这似乎是个坏主意。你想对引用成员变量做什么?@BenVoigt-看起来是初始化器列表导致了这个问题,而不是临时变量的生命周期:@awoodland:他只是还没走那么远;我编辑了我的问题并添加了一件事:现在我的带值的普通命令也不起作用了。@Jjang-这是一个稍微不同的问题,有一个很好的答案:-基本上你需要使用initaliser列表语法,就像我在我的回答中所做的那样,不管你是否有默认值。我明白了要点,但我不知道在我的情况下该怎么做。我是否应该创建2个假节点来初始化常量?@Jjang如果您刚刚添加到问题中,您可以执行以下操作:Edge::Edgeconst Node&newBase,const Node&newTarg:basenewBase,targetnewTarget{}确定吗?我的节点对象正在获取int而不是节点类型。这还是好的吗?编辑后的问题,现在即使是我的带值的普通计算器也不起作用了