2012-05-03 1 views
2

Я реализовал ребра (как в графах), используя 4 класса: Node, Node_Linkedlist, Edge, Edge_Linkedlist. узел имеет частный элемент ИНТ и края имеет 2 эталонные пользователей к узлу:Как использовать оператор печати для экземпляра const класса?

private: 
    Node& in; 
    Node& out; 

Край 2 рабочих конструкторами таким образом, что край поддерживает как Node и const Node.

Edge(Node& tmpin, Node& tmpout) : in(tmpin),out(tmpout) {}; 
Edge(const Node& tmpin, const Node& tmpout) : in(Node(tmpin)),out(Node((tmpout))) {}; 

<< Оператор:

ostream& operator<<(ostream& out, const Edge& node) 
{ 
    out<<node.in<<endl; 
    return out; 
} 

Это работает для Node, но не для const Node. В const Node, в качестве отладчика в область действия оператора, он выгружает значения int для узла. Почему оператор не работает для const Node?

+0

Вы хотите знать, что происходит не так (долго), или как это исправить (короткий)? – Beta

+0

@Beta Вы имеете в виду, кроме существующих ответов? –

+0

Ничего. мой комментарий и ответ @ LuchianGrigore пересек. (Я бы написал более длинное объяснение, чем его, но я не думаю, что это было бы лучше.) – Beta

ответ

3

Ваш код недействителен - вы привязываете неконстантную ссылку на временный конструктор - Node(tmpin) и Node(tmpout) являются временными - и работают в неопределенное поведение. Чтобы поддержать const, вам нужно либо сделать своих членов const, указатели, либо сделать их объектами вместо ссылок.

Лично я хотел бы сделать их смарт-указатели:

private: 
    std::shared_ptr<Node> in; 
    std::shared_ptr<Node> out; 
+0

Я не был уверен, что для этого потребуются члены const. Благодаря! – winuall