LINUX.ORG.RU

[ c++ ] default constructor


0

1

никак не могу понять почему у меня не вызывается конструктор по умолчанию, когда создаю объекты класса test1 и test2(компилятор создает какой то другой конструктор, не могу понять почему):

class Test

{

public:

Test();

Test( int a = 5 );

~Test();

private:

int cnt;

};

Test::Test()

{

cout<<«default constructor»<<endl;

}

Test::Test( int a )

{

cout<<«constructor with parametres:»<<a<<endl;

}

Test::~Test()

{ cout<<«destructor»<<endl;

}

int main()

{

cout<<«main start»<<endl;

cout<<«call: Test test1»<<endl;

Test test1;

cout<<«call: Test test2»<<endl;

Test test2();

cout<<«call: Test test3(10)»<<endl;

Test test3(10);

cout<<«main finish»<<endl;

return 0;

}

вывод:

main start

call: Test test1

call: Test test2

call: Test test3(10)

constructor with parametres:10

main finish

destructor



Последнее исправление: Cinewer (всего исправлений: 1)
 Test test2();

А где у тебя тут конструирование объекта? Ты определяешь функцию без аргументов, которая возвращает Test.

Reset ★★★★★
()

И вообще, твой пример собираться не должен, ибо:

10.cpp: In function ‘int main()’:
10.cpp:53:10: error: call of overloaded ‘Test()’ is ambiguous
10.cpp:31:1: note: candidates are: Test::Test(int)
10.cpp:23:1: note:                 Test::Test()

Если убрать параметр по-умолчанию, то всё собирается и работает корректно:

main start
call: Test test1
default constructor
call: Test test2
call: Test test3(10)
constructor with parametres:10
main finish
destructor
destructor

Reset ★★★★★
()

А как Вы вообще умудрилось это собрать?

test.cpp: In function ‘int main()’:
test.cpp:37: error: call of overloaded ‘Test()’ is ambiguous
test.cpp:15: note: candidates are: Test::Test(int)
test.cpp:13: note:                 Test::Test()
test.cpp:41: error: call of overloaded ‘Test()’ is ambiguous
test.cpp:15: note: candidates are: Test::Test(int)
test.cpp:13: note:                 Test::Test()

И осильте уже LORCODE;-)

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

А откуда у тебя две ошибки? Вот тут

Test test2();
никаких неоднозначностей нет, правда работает не так как ожидает автор кода :)

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

А, ну я там скобочки то убрал;-)

Вообще конечно подстава. Это вроде gcc расширение с вложенными ф-ми?

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

Да нет, это объявление прототипа функции. Их же везде можно объявлять. Студия тоже такое проглатывает

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

Вообще спасибо большое. Я знал что так делать нельзя, но не знал почему (как то было неочевидно).

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

я хочу, чтобы в случае Test test1; или Test test2(); вызывался конструктор по умолчанию, который я определяю без параметров.

и почему компилятор не может понять, какой конструктор вызывать, если я использую просто конструктор Test() и Test(int a);

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

хорошо, пусть это будет просто определение прототипа.

а почему тогда же компилятор компилирует и не ругается?

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

А на что ему ругаться? Всё корректно (до тех пор, пока ты не начнёшь использовать объявленное, как объект)

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

спасибо, понял.

еще раз уточнить хочу

1. экземпляры класса можно создавать либо например так Test test1; или же явно с параметрами Test test2(2);

2. если я явно определяю консруктор по умолчанию например Test(), то я уже не могу использовать конструктор по умолчанию с дефолтными параметрами например Test(int a =5 ), т.к. он эквивалентен первому конструктору.

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

Так он же черным по белому пишет:
«ошибка: вызов перегруженной «Test()» имеет неоднозначную трактовку
замечание: candidates are:
замечание: Test::Test(int)
замечание: Test::Test()»

son_of_a_gun
()
Ответ на: комментарий от iliyap

Должно быть так:

class Test {
public:
  Test(){}
  Test(int a){}
};
Каким образом explicit должен был убрать неоднозначность?

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