LINUX.ORG.RU

Как вызвать конструктор с параметром, для класса являющегося членом другого класса.


0

1

Есть два класса c1 и c2 У каждого класса конструктор с параметром. Класс c1 является членом класса c2.

Вот код.

class c1{
int v;
public:
c1(int n);//  конструктор класса c1
};
c1::c1(int n){
v=n;
printf("Constructior c1.\n");
}

class c2{
int v;
public:
c2(int n);  //  конструктор класса c2
c1 e1;  
};


c2::c2(int n){
v=n;
e1.c1(n); //пытаюсь вызвать конструктор класса c1, но не выходит
printf("Constructior c2\n");
}

int main(int argc,char **argv){
c2 e2(5);
}
При компиляции выдается сообщение о ошибке
test.cpp: In constructor ‘c2::c2(int)’:
test.cpp:29: error: no matching function for call to ‘c1::c1()’
test.cpp:17: note: candidates are: c1::c1(int)
test.cpp:12: note:                 c1::c1(const c1&)
test.cpp:31: error: invalid use of ‘class c1’
Я так понимаю, что ошибка из за того, что конструктор вложенного класса имеет параметр. Вопрос. Как передать параметр конструктору члена класса?



Последнее исправление: Mixaluch384 (всего исправлений: 1)

>e1.c1(n); //пытаюсь вызвать конструктор класса c1, но не выходит

Охлол. Срочно читать Страуструпа до просветления. А потом - ещё раз.

e1 = c1(n);
schizoid ★★★
()
Ответ на: комментарий от Mixaluch384

Если уже не можешь читать, то кажется как-то так:

c2::c2(int n) : e1(n) { .... }

karak
()

окромя упомянутых тут списков инициализации можно пойти еще несколькими извратными путями:
1) в класс c2 поместить указатель на c1, а не объект, в конструкторе с2 его new и деструкторе delete, ну ты понел;
2) приравняшку к n из конструктора c1 вынести в отдельный метод, например init, и соответственно его дергать из конструктора c2 :3

anonymous
()
Ответ на: комментарий от Reset

Умники, заметили, что создаётся экземпляр класса без дефолтного конструктора, а то, что он конструктор вызывает как функцию - это нормально? К слову, сообщение об ошибке именно на это и указывает.

Даже если он разберётся со списками инициализации - он и впредь будет так создавать объекты. Это нормально?

Списки инициализации - не панацея. Дефолтные конструкторы тоже не помешает объявлять.

schizoid ★★★
()
Ответ на: комментарий от schizoid

Даже если он разберётся со списками инициализации - он и впредь будет так создавать объекты. Это нормально?

Не оправдывайся, даже если бы у класса C был бы дефолтный конструктор, то написание такого кода признак быдлокодерства и ниасиляторства страуструпа.

Дефолтные конструкторы тоже не помешает объявлять.

зачем?

Reset ★★★★★
()
Ответ на: комментарий от kermzyxer

Почитал Страуструпа. Проблему решил. Параметры конструктору вложенного класса передаются так.

c2::c2(int n):e1(n){

Mixaluch384
() автор топика
Ответ на: комментарий от Reset

>Не оправдывайся, даже если бы у класса C был бы дефолтный конструктор, то написание такого кода признак быдлокодерства и ниасиляторства страуструпа. Читай посты, на которые отвечаешь, прежде чем это делать. Вдумчиво.

Где в моём первом ответе на тред было хоть слово об инициализации и дефолтных конструкторах?

>зачем?

Тебе, очевидно, тоже не помешает проштудировать Страуструпа.

schizoid ★★★
()
Ответ на: комментарий от schizoid

Где в моём первом ответе на тред было хоть слово об инициализации и дефолтных конструкторах?

Если бы был дефолтный конструктор, то у тебя в коде проблемы с производительностью. -O2 конечно это может свернуть до одного вызова конструктора, но это не гарантированно.

Тебе, очевидно, тоже не помешает проштудировать Страуструпа.

Давай, расскажи зачем надо создавать дефолтный конструктор без надобности.

Reset ★★★★★
()
Ответ на: комментарий от schizoid

> Умники, заметили, что создаётся экземпляр класса без дефолтного конструктора, а то, что он конструктор вызывает как функцию - это нормально?
Я все заметил, даже код скомпилировал(исправленный) и запустил программу. Только вот объект e1 определен, как поле класса, и твой вариант тут не катит. А по поводу создания объектов, ТС пусть Страуструпа читает.

kermzyxer
()
Ответ на: комментарий от Reset

> Дефолтные конструкторы тоже не помешает объявлять.

зачем?

std::array<c1, 5> c1Array; - хотя бы чтобы создавать массивы обьектов?

frozenix ★★★
()
Ответ на: комментарий от Reset

тогда следует быть предельно акуратным, чтобы случайно не написать c1 someName; и учитывать други случаи.

ЗЫ heap вы тоже использовать не будете?

frozenix ★★★
()
Ответ на: комментарий от frozenix

>тогда следует быть предельно акуратным, чтобы случайно не написать c1 someName;

Если я так напишу, компилятор мне об этом скажет. Чай не питон же какой-нибудь

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

Ладно, у обоих способов есть свои плюсы и недостатки и использовать их нужно исходя из задачи. Т.к. задачи тут как таковой нет, необходимости в дефолтном кострукторе нет. И не будем разводить тут холи вар.

frozenix ★★★
()
Ответ на: комментарий от Reset

>у тебя в коде

Ты вообще видел мой код, чтобы судить его? :)

>проблемы с производительностью

Если не делать как ТС, то и не будет. Я так и не предлагал. Ты о чём?

schizoid ★★★
()
Ответ на: комментарий от kermzyxer

Я вырвал строку кода из контекста с неправильным синтаксисом, указал на верный вариант использования, а ты принял это за исправление работоспособности кода? Печаль.

schizoid ★★★
()
Ответ на: комментарий от frozenix

тогда следует быть предельно акуратным, чтобы случайно не написать c1 someName; и учитывать други случаи.

Вот как раз отсутствует конструктора по умолчанию обезопасит тебя от случайного написания c1 someName.

heap вы тоже использовать не будете?

Буду, но только по необходимости и в обернутом виде.

Reset ★★★★★
()
Ответ на: комментарий от schizoid

Ты вообще видел мой код, чтобы судить его? :)

Вот это разве не твой код?

e1 = c1(n);

Если не делать как ТС, то и не будет. Я так и не предлагал. Ты о чём?

Вот это не ты предложил?

e1 = c1(n);

Reset ★★★★★
()
Ответ на: комментарий от schizoid

Человек спросил о том как исправить проблему, а ты исправил синтаксис, а проблема осталась. Это один из признаков быдлокодерства.

Reset ★★★★★
()
Ответ на: комментарий от schizoid

Да поифиг уже. Главное, мы все знаем, как правильно, возможно, даже ТС.

kermzyxer
()
Ответ на: комментарий от Reset

> Человек спросил о том как исправить проблему, а ты исправил синтаксис, а проблема осталась.

Про какую проблему вы говорите?

Mixaluch384
() автор топика

Тред полон взаимопонимания, любви и обожания.

anonymous
()
Ответ на: комментарий от Mixaluch384

Которую ты озвучил, дилдо.

anonymous
()
Ответ на: комментарий от Reset

>Это один из признаков быдлокодерства.

Ладно, сдаюсь. Ты меня раскусил. Больше так не буду, ок?

schizoid ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.