0

所以我在 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;
}

但它不会让我,它说没有运算符“=”与此运算符匹配。但我确实为节点创建了一个“=”运算符并检查它是否有效......

4

3 回答 3

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;
}

不过,这是否是好的设计是另一个问题。对于您要解决的潜在问题,很可能有一个更聪明的解决方案。

于 2012-04-30T17:23:09.247 回答
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对象的引用。

于 2012-04-30T17:23:52.137 回答
0

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

struct Reference
    {
    T* r_noncopyable_object;
    };
于 2018-01-14T13:41:52.903 回答