Задать вопрос
@Px2

Почему объект не передается по ссылке?

Всем привет!
Подскажите пожалуйста, в чем проблема. Передаю объект в конструктор другого класса по ссылке и получаю ошибку "In constructor ‘BoxContainer::BoxContainer(NumberBox&)’: no matching function for call to ‘NumberBox::NumberBox()’".
Почему ожидается конструктор без параметров (у меня такого нет)? Означает ли это, что на самом деле будет происходить копирование объекта?
Если же использовать передачу не по ссылке, а по указателю, то всё ок.

class NumberBox {
	int number;
public:
	NumberBox(int i);
	int get();
};


class BoxContainer {
	NumberBox nbox;
public:
	BoxContainer(NumberBox& nb);
	void say();
};
  • Вопрос задан
  • 78 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
В BoxContainer, скорее всего, не происходит инициализация nbox.
Поскольку NumberBox не имеет конструктора по умолчанию, компилятор ругается, что нельзя это поле инициализировать по умолчанию.
Так что варианта два
1. nbox инициализировать, наконец.
BoxContainer::BoxContainer(NumberBox& nb) : nbox(nb) { ... }

2. Придумать NumberBox конструктор по умолчанию
class NumberBox {
	...
public:
	NumberBox();
	NumberBox(int i);
	...
};
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Код конструктора-то дайте. И заодно отметьте, на какую конкретно строчку компилятор ругается.

Скорее всего у вас внутри конструктора BoxContainer идет присвоение в член nbox. Но у вас не определен оператор присвоения (или конструктор копирования) для NumberBox. Определите его (можно default). Так что с передачей по ссылке все хорошо, но вот то, что вы дальше с этой ссылкой пытаетесь сделать у вас не работает.

Руководствуйтесь правилом трех-пяти.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы