![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| ANTON_AL |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 292 Регистрация: 27.1.2007 Репутация: нет Всего: нет |
Добрый день всем !!
Имею вот такой код...
Он не компилруется, ругается так: Error 1 error C2662: 'Base::Clone' : cannot convert 'this' pointer from 'const Base' to 'Base &' И что самое непонятное, он ругается на this даже в том случае, если this не ставить, а просто написать что то типа этого
В чем тут дело ?? |
||||
|
|||||
| mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
ANTON_AL, скорее всего, так:
|
|||
|
||||
| ANTON_AL |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 292 Регистрация: 27.1.2007 Репутация: нет Всего: нет |
mr.Anderson, метод Clone( ) возвращает указатель, так что так не выйдет. =(
|
|||
|
||||
| Xenon |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
const нужно брать, чтобы просто Clone() работал, но вообще чего ты хочешь сделать?
У тебя вообще по-моему, должен бесконечный вызов operator = начаться Это сообщение отредактировал(а) Xenon - 30.4.2007, 22:41 |
|||
|
||||
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
эта функция не может вызываться константным объектом типа Base , а в оператор = передается именно константа |
|||
|
||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
ANTON_AL, Base* Clone( ) const...
само тело Clone в общем случае такое: return new myClass (*this); -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
| ANTON_AL |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 292 Регистрация: 27.1.2007 Репутация: нет Всего: нет |
Метод Clone( ) будет использоваться в дальнейшем, вне этого класса, просто я вставил его в operator=, чтобы не повторять код два раза ( для Clone, и для Copy-Constructor/operator= )
А бесконечного вызова не будет, т.к. Clone возвращает указатель, а не объект. А указатели присваиваются безо всяких конструкторов... Вот. |
|||
|
||||
| Xenon |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
А разве строчка
Не будет ли в последствии вызывать Base operator= ( const Base &rhs ), а потом еще и еще?.. PS. Не заметил насчет указателя. Const тогда нужно переставить просто. Это сообщение отредактировал(а) Xenon - 30.4.2007, 22:47 |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
нет. this нельзя приравнивать. -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| ANTON_AL |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 292 Регистрация: 27.1.2007 Репутация: нет Всего: нет |
archimed7592,
Для Clone( ) так не пойдет. Там надо хитро копировать, т.к. class Base - это просто для демонстрации проблемы, а вообще это у меня дерево-( class BoundingAreasTree ), которое нужно клонировать ... ну сами знаете как const пробовал в конец добавить, не помогает, вместо старой ошибки выдаёт такую: Error 1 error C2106: '=' : left operand must be l-value Добавлено через 3 минуты и 47 секунд Mayk,
А почему ?? Это сообщение отредактировал(а) ANTON_AL - 30.4.2007, 22:54 |
||||
|
|||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
this изначально константный указатель. Подобный код в принципе невозможен. Напротив реализуем опреатор присваивания. При большрй лени -копи-конструктор можно релизить через него. Этот Clone тем более.
|
|||
|
||||
| ANTON_AL |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 292 Регистрация: 27.1.2007 Репутация: нет Всего: нет |
Любитель, Согласен, сам только что так сделал уже. Спасибо.
|
|||
|
||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
[нудит]
то есть он не является константным указателем. this просто не является lvalue. [/нудит] Это сообщение отредактировал(а) Mayk - 30.4.2007, 23:11 -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
Mayk, хватит придираться! Понятно, что не lavalue - this подставляется как значение в вызов методов. Нигде, конечно же, не хранится.
К слову - есть у нас препод (точнее преподша - вообще неплохая) в универе. Про дельфийский self объясняла как про специальное поле... |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |