Задание значений по умолчанию для ссылок на переменные-члены
Поэтому я создал класс в 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;
};