Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/19: Рейтинг темы: голосов - 19, средняя оценка - 5.00
1183 / 468 / 87
Регистрация: 23.06.2009
Сообщений: 6,390
1

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

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

Author24 — интернет-сервис помощи студентам
при таком коде
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
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.03.2010, 22:21
Ответы с готовыми решениями:

[C++] В чём тут ошибка? (делаю конструктор-копировщик)
Пытаюсь написать класс с конструктором-копировщиком.В чём тут ошибка? class Subroutine { ...

Конструктор копировщик
Самостоятельно изучаю С++ по Либерти(освой за 21 день) Требуется создать класс и конструктор...

Конструктор-копировщик
Доброго времени суток! Сейчас изучаю класы, и столкнулся с такой проблемой. Компилятор...

Конструктор-копировщик
Matrix::Matrix(const Matrix &amp; rhs) { itsNumOfStr = rhs.itsNumOfStr; itsNumOfCol =...

19
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
21.03.2010, 22:38 2
Почитай книгу по внимательнее, и скачай ещё какую нибудь книгу по C++.
C++ 24 часа выучить не возможно, это и так понятно.

Я не знаю нормальная ли эта книга: которую ты читаешь, дай пожалуйста ссылку мне интересно,
что это за книженция.
0
1183 / 468 / 87
Регистрация: 23.06.2009
Сообщений: 6,390
21.03.2010, 23:41  [ТС] 3
C++ за 21 день страница 248
1
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
21.03.2010, 23:47 4
За 21 тоже не возможно.
0
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;
}
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
01.08.2011, 18:47 6

Не по теме:

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



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

Не по теме:


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



Добавлено через 1 минуту
Кстати в конструкторе копирования аргументом должна быть ссылка на константный объект.
Ага. Это не обязательно но не помешает .. Так как есть вероятность что вы попытаетесь изменить что-то в конструкторе. И компилятору будет проще указать вам на вашу ошибку.
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
01.08.2011, 19:01 9
Цитата Сообщение от Maxwe11 Посмотреть сообщение
Kastaneda, невсегда) взгляни на auto_ptr
Но то, что невсегда - это да, но тем не менее я всегда так делаю)

А можно пример с auto_ptr? Что-то у меня с ним конструктор копирования не вызывается.
0
Заблокирован
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 студии
1
Kastaneda
01.08.2011, 21:15
  #11

Не по теме:

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

0
Заблокирован
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 );
0
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
02.08.2011, 02:43 13
Цитата Сообщение от Сыроежка Посмотреть сообщение
либо константную ссылку на объект const T &, либо изменяемую ссылку на объект volatile T &, либо константную изменяемую ссылку на объект const volatile T &.
пусть придирки, но всё же
ссылку на константный объект,
ссылку на volatile объект,
ссылку на константный volatile объект.
0
Заблокирован
02.08.2011, 04:59 14
Цитата Сообщение от OstapBender Посмотреть сообщение
пусть придирки, но всё же
ссылку на константный объект,
ссылку на volatile объект,
ссылку на константный volatile объект.
Честно говоря, не понял смысла ваших придирок. К чему вы придрались? К термину "константная ссылка"? Так это совершенно корректный термин.
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
02.08.2011, 08:06 15
Ссылки по дефолту константные, из нельзя переопределить.
1
Заблокирован
02.08.2011, 17:21 16
Цитата Сообщение от Kastaneda Посмотреть сообщение
Ссылки по дефолту константные, из нельзя переопределить.
Еще раз повторяю, что термин "константная ссылка" является корректным термином, который используется вописании стандарте. И все понимают, кто конечно знаком со стандартом, о чем идет речь, то есть об объявлении вида const T &.
1
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
03.08.2011, 10:09 17
Цитата Сообщение от Сыроежка Посмотреть сообщение
термин "константная ссылка" является корректным
Ага, является. Но const T & не есть константная ссылка на объект. Это константная ссылка на константный объект, или, если масло масляное исключить, просто ссылка на константный объект.
2
Заблокирован
03.08.2011, 20:07 18
Цитата Сообщение от silent_1991 Посмотреть сообщение
Ага, является. Но const T & не есть константная ссылка на объект. Это константная ссылка на константный объект, или, если масло масляное исключить, просто ссылка на константный объект.
Вы из тех "продвинутых", кто даже со второго раза не понимает?! Повторяю тогда специально для вас в третий раз: этот термин - константная ссылка - используется в стандарте! Вам не нравится? Пишите предложение в комитет по стандартизации, чтобы из стандарта исключили это словосочетание. Когда снова попытаетесь что-то там возразить, то пожалуйста, перечитайте это мое сообщение в очередной раз, а то мне лень писать одно и тоже для таких "продвинутых".
0
Заблокирован
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/discuss... -and-const
жирном ширифтом выделенно там
2
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
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."
0
03.08.2011, 22:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.08.2011, 22:34
Помогаю со студенческими работами здесь

Виртуальный конструктор копировщик.
Добрый вечер . Объясните для чего в природе может быть использован виртуальный конструктор...

конструктор копировщик-смысл?
объясните пожалуйста для чего нужен конструктор копировщик... в С++ за 21 день страница 248

Конструктор копировщик объектов, содержащих массивы
Конструктор копировщик который будет создавать объекты в которых есть массивы. Можно просто...

Стандартный конструктор копировщик и оператор = не справляются со своей задачей
Всем привет ! Выяснил , что стандартный конструктор копировщик и оператор = не справляются со...

Параметр rhs, что это и для чего (конструктор-копировщик)
Вот код: #include &lt;iostream&gt; class jurnal { public: jurnal() { }

Определить конструктор без параметров, конструктор с одним параметром, конструктор с двумя параметрами, деструктор
Создать класс «матрица». Данный класс должен содержать элементы типа int, определяющие число строк,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru