Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Конструктор копирования (глупый вопрос) / 8 сообщений из 8, страница 1 из 1
20.10.2006, 17:20
    #34070800
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конструктор копирования (глупый вопрос)
В литературе рекомендуют параметр-ссылку переданную в конструктор копирования обозначать через const, чтобы не изменить исходный объект. Все получается, если обращаюсь к окрытым переменным исходного класса, но если доступ предоставляется через методы класса (а так чаще и бывает) то комп. выдает ошибку
Код: plaintext
error C2662: 'A::RetN' : cannot convert 'this' pointer from 'const A' to 'A &'
. Что я делаю не так? Как правильно поступить, чтобы остался const и получать значение через метод класса, и все работало?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
class A{
   public:
	    A(const A &srcA)
		{
			n = srcA.RetN();//на это ругается: error C2662: 'A::RetN' : cannot convert 'this' pointer from 'const A' to 'A &'
			n = srcA.n;	//так все ок
		}
...
...
		int	n;
		int RetN()	{return n;}
};
...
Рейтинг: 0 / 0
20.10.2006, 17:26
    #34070829
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конструктор копирования (глупый вопрос)
TubrikЧто я делаю не так? Как правильно поступить, чтобы остался const и получать значение через метод класса, и все работало?

Если свойства классов доступны через методы, то их скрывают в привату или протектед.

Если ты хочешь изменить свойство константного класса, то поставь ему mutable (сам не пробовал, но попробуй, можешь потом результат рассказать).
...
Рейтинг: 0 / 0
20.10.2006, 17:33
    #34070846
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конструктор копирования (глупый вопрос)
Akh TubrikЧто я делаю не так? Как правильно поступить, чтобы остался const и получать значение через метод класса, и все работало?

Если свойства классов доступны через методы, то их скрывают в привату или протектед.

Если ты хочешь изменить свойство константного класса, то поставь ему mutable (сам не пробовал, но попробуй, можешь потом результат рассказать).

Наверное меня не так поняли. Вопрос в том, почему не получается использовать строку
Код: plaintext
 n = srcA.RetN();
???
...
Рейтинг: 0 / 0
20.10.2006, 17:45
    #34070895
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конструктор копирования (глупый вопрос)
..или компилятор считает, что используемый метод исходного класса может изменить данные в нем?
...
Рейтинг: 0 / 0
20.10.2006, 17:53
    #34070928
Test123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конструктор копирования (глупый вопрос)
int RetN() const {return n;}
Нельзя вызывать неконстантные функции у констант.
...
Рейтинг: 0 / 0
20.10.2006, 17:53
    #34070929
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конструктор копирования (глупый вопрос)
Tubrik..или компилятор считает, что используемый метод исходного класса может изменить данные в нем?

Метод должен быть константным
...
Рейтинг: 0 / 0
20.10.2006, 17:55
    #34070940
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конструктор копирования (глупый вопрос)
все получилось) нужно было немного подумать) а не сразу на форум..
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
class A{
   public:
	    A(const A &srcA)
		{
			n = srcA.RetN();//и так ок)
			n = srcA.n;	//так все ок
		}
...
...
		int	n;
		int RetN()const	{return n;} //нужен был константный метод, чтобы успокоить компилятор
};
...
Рейтинг: 0 / 0
20.10.2006, 19:22
    #34071194
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конструктор копирования (глупый вопрос)
TubrikВ литературе рекомендуют параметр-ссылку переданную в конструктор копирования обозначать через const, чтобы не изменить исходный объект. Все получается, если обращаюсь к окрытым переменным исходного класса, но если доступ предоставляется через методы класса (а так чаще и бывает) то комп. выдает ошибку

С++ - это не Smalltalk, в нем можно обращаться к приватным полям объекта, на который ссылается srcA (вообще можно иметь доступ к приватным членам любого объекта данного класса из методов данного класса).
Поэтому вызывать аксессор вовсе не обязательно и даже вредно в смысле производительности, если он не реализованный inline конечно.

Если ну очень хочется пользоваться аксессором (хотя это даже не принято можно сказать), объяви аксессор const . Собственно таким он и должен быть всегда.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Конструктор копирования (глупый вопрос) / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]