【问题标题】:Giving default values to reference member variables为引用成员变量提供默认值
【发布时间】:2012-04-30 17:16:04
【问题描述】:

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

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

【问题讨论】:

  • 你试过什么?你知道如何为函数编写默认参数吗?
  • @KerrekSB:添加默认参数并没有真正的帮助。
  • 这似乎是个坏主意。你想用引用成员变量做什么?
  • @BenVoigt - 看起来是初始化列表导致了问题,而不是临时人员的生命周期:)
  • @awoodland:他还没有走到那一步;)

标签: c++ class reference constructor object-lifetime


【解决方案1】:

您可以像任何其他参数一样提供new1new2 默认值。诀窍在于,由于它们是通过引用传递的,并且(可能)您正在使用它们来设置basetarget,它们需要足够长的时间才能使这有意义。您可以通过将静态“虚拟”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;
}

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

【讨论】:

  • 我编辑了我的问题并添加了一件事:现在我的正常值的 c'tor 也不起作用。
  • @Jjang - 这是一个稍微不同的问题,有一个很好的答案:stackoverflow.com/a/4589276/168175 - 基本上你需要像我在我的回答中所做的那样使用初始化列表语法,无论你是否有默认或不是。
  • 我明白了,但我不知道在我的情况下该怎么做。我应该做 2 个假节点,只是为了初始化 const?
  • @Jjang 在您刚刚添加到您的问题的情况下,您可以这样做:Edge::Edge(const Node& newBase, const Node& newTarg) : base(newBase), target(newTarget) {}
  • 确定吗?我的 Node 对象正在获取 int 而不是 Node 类型。那还好吗?
【解决方案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 对象的引用。

【讨论】:

  • 已编辑问题,现在即使是我的正常值的 c'tor 也不起作用
【解决方案3】:

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

struct Reference
    {
    T* r_noncopyable_object;
    };

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 2020-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多