Задание значений по умолчанию для ссылок на переменные-члены

Поэтому я создал класс в C++, который имеет 2 члена ссылочного типа:

class Edge{
private:
const Node& base;
const Node& target;

public:
    Edge(const Node& new1, const Node& new2);

Я хочу дать значения по умолчанию для базы и цели в C'tor. Который означает, что:

Edge()

не будет ошибкой, но создаст объект Edge. Как я могу это сделать?

редактировать: я также пытаюсь сделать:

Edge::Edge(const Node& newBase, const Node& newTarg)
{
    m_base=newBase;
    m_target=newTarg;
}

Но это не позволит мне, он говорит, что ни один оператор "=" не соответствует этим операторам. Но я сделал оператор "=" для узлов и проверил, работает ли он.......

3 ответа

Решение

Вы можете дать 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;
}

Если это хороший дизайн или нет, это еще одна проблема. Вполне может быть более разумное решение основной проблемы, которую вы пытаетесь решить.

Вот версия, которая работает и для непостоянных ссылок:

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 объект.

Другое решение было бы использовать обертку, которая является копируемой

struct Reference
    {
    T* r_noncopyable_object;
    };
Другие вопросы по тегам