Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.64
^Tecktonik_KiLLeR
1158 / 440 / 22
Регистрация: 23.06.2009
Сообщений: 6,227
Завершенные тесты: 1
#1

Конструктор - копировщик: ошибка - C++

21.03.2010, 22:21. Просмотров 2655. Ответов 19
Метки нет (Все метки)

при таком коде
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class cat{
public:
    cat();
    ~cat();
    cat(cat&);
};
 
cat::cat(){
cout<<"Cat constructor"<<endl;
}
cat::~cat(){
cout<<"Cat Destructor"<<endl;
}
cat::cat(){
cout<<"Cat copy constructor"<<endl;
}
 
cat f1(cat thecat);
cat *f2(cat *thecat);
 
 
int main(){
    cout<<"making cat"<<endl;
cat frisky;
cout<<"call f1"<<endl;
f1(frisky);
cout<<"call f2"<<endl;
f2(&frisky);
system("pause");
return 0;
}
 
cat f1(cat thecat){
cout<<"f1 return"<<endl;
return thecat;
}
 
cat f2(cat *thecat){
cout<<"f2 return"<<endl;
return thecat;
}
выводит такое

Error 1 error C2084: function 'cat::cat(void)' already has a body d:\c++ projects\proba\proba\code.cpp 19
Error 2 error C2264: 'cat::cat' : error in function definition or declaration; function not called d:\c++ projects\proba\proba\code.cpp 29
Error 3 error C2556: 'cat f2(cat *)' : overloaded function differs only by return type from 'cat *f2(cat *)' d:\c++ projects\proba\proba\code.cpp 43
Error 4 error C2040: 'f2' : 'cat (cat *)' differs in levels of indirection from 'cat *(cat *)' d:\c++ projects\proba\proba\code.cpp 43
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.03.2010, 22:21     Конструктор - копировщик: ошибка
Посмотрите здесь:

C++ [C++] В чём тут ошибка? (делаю конструктор-копировщик)
C++ конструктор копировщик-смысл?
Конструктор-копировщик C++
Конструктор копировщик C++
C++ Виртуальный конструктор копировщик.
this(Всегда ли вызывается конструктор при не явной передачи объекта в конструктор) C++
Параметр rhs, что это и для чего (конструктор-копировщик) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Genius Ignat
1234 / 772 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
21.03.2010, 22:38     Конструктор - копировщик: ошибка #2
Почитай книгу по внимательнее, и скачай ещё какую нибудь книгу по C++.
C++ 24 часа выучить не возможно, это и так понятно.

Я не знаю нормальная ли эта книга: которую ты читаешь, дай пожалуйста ссылку мне интересно,
что это за книженция.
^Tecktonik_KiLLeR
1158 / 440 / 22
Регистрация: 23.06.2009
Сообщений: 6,227
Завершенные тесты: 1
21.03.2010, 23:41  [ТС]     Конструктор - копировщик: ошибка #3
C++ за 21 день страница 248
Genius Ignat
1234 / 772 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
21.03.2010, 23:47     Конструктор - копировщик: ошибка #4
За 21 тоже не возможно.
xxNpCxx
0 / 0 / 0
Регистрация: 01.08.2011
Сообщений: 8
01.08.2011, 18:41     Конструктор - копировщик: ошибка #5
Отвечаю почему ошибка в конструкторе-копировальщике - В определении конструктора-копировальщика вы забыли указать входной параметр , а именно - ссылку на объект.

Цитирую ваш код :

Цитата Сообщение от ^Tecktonik_KiLLeR Посмотреть сообщение
cat::cat(){
cout<<"Cat copy constructor"<<endl;
}
И код с исправленной ошибкой :
C++
1
2
3
cat::cat([COLOR="red"]cat &rsk[/COLOR]){
cout<<"Cat copy constructor"<<endl;
}
Еще у вас есть одна ошибка опять же в определении но на этот раз в определении функции f2.

Ваш код :

Цитата Сообщение от ^Tecktonik_KiLLeR Посмотреть сообщение
cat f2(cat *thecat){
cout<<"f2 return"<<endl;
return thecat;
}
И код с исправленной ошибкой :

C++
1
2
3
4
cat [COLOR="Red"]*[/COLOR]f2(cat *thecat){
cout<<"f2 return"<<endl;
return thecat;
}
Kastaneda
Форумчанин
Эксперт С++
4257 / 2789 / 219
Регистрация: 12.12.2009
Сообщений: 7,118
Записей в блоге: 1
Завершенные тесты: 1
01.08.2011, 18:47     Конструктор - копировщик: ошибка #6

Не по теме:

Цитата Сообщение от xxNpCxx Посмотреть сообщение
конструкторе-копировальщик
copy constructor, а не copier, поэтому конструктор копирования!



Добавлено через 1 минуту
Кстати в конструкторе копирования аргументом должна быть ссылка на константный объект.
Jupiter
Каратель
Эксперт C++
6549 / 3969 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
01.08.2011, 18:51     Конструктор - копировщик: ошибка #7
Цитата Сообщение от Kastaneda Посмотреть сообщение
Кстати в конструкторе копирования аргументом должна быть ссылка на константный объект.
Kastaneda, невсегда) взгляни на auto_ptr
xxNpCxx
0 / 0 / 0
Регистрация: 01.08.2011
Сообщений: 8
01.08.2011, 18:54     Конструктор - копировщик: ошибка #8
Цитата Сообщение от Kastaneda Посмотреть сообщение

Не по теме:


copy constructor, а не copier, поэтому конструктор копирования!



Добавлено через 1 минуту
Кстати в конструкторе копирования аргументом должна быть ссылка на константный объект.
Ага. Это не обязательно но не помешает .. Так как есть вероятность что вы попытаетесь изменить что-то в конструкторе. И компилятору будет проще указать вам на вашу ошибку.
Kastaneda
Форумчанин
Эксперт С++
4257 / 2789 / 219
Регистрация: 12.12.2009
Сообщений: 7,118
Записей в блоге: 1
Завершенные тесты: 1
01.08.2011, 19:01     Конструктор - копировщик: ошибка #9
Цитата Сообщение от Maxwe11 Посмотреть сообщение
Kastaneda, невсегда) взгляни на auto_ptr
Но то, что невсегда - это да, но тем не менее я всегда так делаю)

А можно пример с auto_ptr? Что-то у меня с ним конструктор копирования не вызывается.
LosAngeles
Заблокирован
01.08.2011, 19:34     Конструктор - копировщик: ошибка #10
C++
1
2
3
4
auto_ptr(auto_ptr<_Ty>& _Right) _THROW0()
        : _Myptr(_Right.release())
        {   // construct by assuming pointer from _Right auto_ptr
        }
C++
1
2
3
4
5
6
_Ty *release() _THROW0()
        {   // return wrapped pointer and give up ownership
        _Ty *_Tmp = _Myptr;
        _Myptr = 0;
        return (_Tmp);
        }
в 2008 студии
Kastaneda
01.08.2011, 21:15
  #11

Не по теме:

Maxwe11, LosAngeles, я просто не туда думать начал, теперь понял)

Сыроежка
Заблокирован
01.08.2011, 23:32     Конструктор - копировщик: ошибка #12
Цитата Сообщение от Kastaneda Посмотреть сообщение

Не по теме:


copy constructor, а не copier, поэтому конструктор копирования!



Добавлено через 1 минуту
Кстати в конструкторе копирования аргументом должна быть ссылка на константный объект.
Конструктор копирования может в качестве параметра иметь ссылку на объект T &, либо константную ссылку на объект const T &, либо изменяемую ссылку на объект volatile T &, либо константную изменяемую ссылку на объект const volatile T &. А также может иметьб дополнительные параметры, если все они имеют значения по умолчанию. Например,

X::X( const X &, int myData = 0 );
OstapBender
582 / 520 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
02.08.2011, 02:43     Конструктор - копировщик: ошибка #13
Цитата Сообщение от Сыроежка Посмотреть сообщение
либо константную ссылку на объект const T &, либо изменяемую ссылку на объект volatile T &, либо константную изменяемую ссылку на объект const volatile T &.
пусть придирки, но всё же
ссылку на константный объект,
ссылку на volatile объект,
ссылку на константный volatile объект.
Сыроежка
Заблокирован
02.08.2011, 04:59     Конструктор - копировщик: ошибка #14
Цитата Сообщение от OstapBender Посмотреть сообщение
пусть придирки, но всё же
ссылку на константный объект,
ссылку на volatile объект,
ссылку на константный volatile объект.
Честно говоря, не понял смысла ваших придирок. К чему вы придрались? К термину "константная ссылка"? Так это совершенно корректный термин.
Kastaneda
Форумчанин
Эксперт С++
4257 / 2789 / 219
Регистрация: 12.12.2009
Сообщений: 7,118
Записей в блоге: 1
Завершенные тесты: 1
02.08.2011, 08:06     Конструктор - копировщик: ошибка #15
Ссылки по дефолту константные, из нельзя переопределить.
Сыроежка
Заблокирован
02.08.2011, 17:21     Конструктор - копировщик: ошибка #16
Цитата Сообщение от Kastaneda Посмотреть сообщение
Ссылки по дефолту константные, из нельзя переопределить.
Еще раз повторяю, что термин "константная ссылка" является корректным термином, который используется вописании стандарте. И все понимают, кто конечно знаком со стандартом, о чем идет речь, то есть об объявлении вида const T &.
silent_1991
Эксперт С++
4951 / 3027 / 149
Регистрация: 11.11.2009
Сообщений: 7,026
Завершенные тесты: 1
03.08.2011, 10:09     Конструктор - копировщик: ошибка #17
Цитата Сообщение от Сыроежка Посмотреть сообщение
термин "константная ссылка" является корректным
Ага, является. Но const T & не есть константная ссылка на объект. Это константная ссылка на константный объект, или, если масло масляное исключить, просто ссылка на константный объект.
Сыроежка
Заблокирован
03.08.2011, 20:07     Конструктор - копировщик: ошибка #18
Цитата Сообщение от silent_1991 Посмотреть сообщение
Ага, является. Но const T & не есть константная ссылка на объект. Это константная ссылка на константный объект, или, если масло масляное исключить, просто ссылка на константный объект.
Вы из тех "продвинутых", кто даже со второго раза не понимает?! Повторяю тогда специально для вас в третий раз: этот термин - константная ссылка - используется в стандарте! Вам не нравится? Пишите предложение в комитет по стандартизации, чтобы из стандарта исключили это словосочетание. Когда снова попытаетесь что-то там возразить, то пожалуйста, перечитайте это мое сообщение в очередной раз, а то мне лень писать одно и тоже для таких "продвинутых".
LosAngeles
Заблокирован
03.08.2011, 20:14     Конструктор - копировщик: ошибка #19
ну раз уж пошли ссылаться на стандарт
ISO definition

References are defined by the ISO C++ standard as follows (excluding the example section):

In a declaration T D where D has the form
& D1

and the type of the identifier in the declaration T D1 is “derived-declarator-type-list T,” then the type of the identifier of D is “derived-declarator-type-list reference to T.” Cv-qualified references are ill-formed except when the cv-qualifiers (const and volatile) are introduced through the use of a typedef (7.1.3) or of a template type argument (14.3), in which case the cv-qualifiers are ignored. [Example: in
typedef int& A;
const A aref = 3; // ill-formed;
// non-const reference initialized with rvalue

the type of aref is “reference to int”, not “const reference to int”. ] [Note: a reference can be thought of as a name of an object. ] A declarator that specifies the type “reference to cv void” is ill-formed.

It is unspecified whether or not a reference requires storage (3.7).

There shall be no references to references, no arrays of references, and no pointers to references. The declaration of a reference shall contain an initializer (8.5.3) except when the declaration contains an explicit extern specifier (7.1.1), is a class member (9.2) declaration within a class declaration, or is the declaration of a parameter or a return type (8.3.5); see 3.1. A reference shall be initialized to refer to a valid object or function. [Note: in particular, a null reference cannot exist in a well-defined program, because the only way to create such a reference would be to bind it to the “object” obtained by dereferencing a null pointer, which causes undefined behavior. As described in 9.6, a reference cannot be bound directly to a bitfield. ]
вот и любители английского языка негодуют
http://www.eetimes.com/discussion/pr...nces-and-const
жирном ширифтом выделенно там
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.08.2011, 22:34     Конструктор - копировщик: ошибка
Еще ссылки по теме:

C++ Конструктор-копировщик
Конструктор копировщик объектов, содержащих массивы C++
C++ Стандартный конструктор копировщик и оператор = не справляются со своей задачей
Конструктор копии: при возвращении объекта ошибка памяти C++
Инициализация объектов через конструктор(объясните в чём ошибка) C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
grizlik78
Эксперт С++
1897 / 1429 / 106
Регистрация: 29.05.2011
Сообщений: 2,985
03.08.2011, 22:34     Конструктор - копировщик: ошибка #20
Справедливости ради должен заметить, что в статье по ссылке делается различие между const reference и reference to const и объясняется почему. А вот в стандарте, к сожалению, действительно под термином const reference понимают ссылку на константу. А приведённая цитата всего лишь показывает возможную ошибку трактовки. Пользователь предполагал создать ссылку на константу, а создал обычную ссылку на переменную, поэтому rvalue в этом выражении недопустимо.

Цитата Сообщение от Сыроежка Посмотреть сообщение
константная ссылка - используется в стандарте!
Строго говоря, этого не может быть, потому что стандарт написан на английском языке Но там действительно в паре мест встречается const reference (точнее даже non-const reference чаще). Но в статье по ссылке вполне справедливо, я считаю, это критикуется. И присоединяюсь к словам автора:
I encourage you to avoid using the term "const reference" when what you really mean is "reference to const."
Yandex
Объявления
03.08.2011, 22:34     Конструктор - копировщик: ошибка
Ответ Создать тему
Опции темы

Текущее время: 15:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru