powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Конструктор с ошибкой
25 сообщений из 30, страница 1 из 2
Конструктор с ошибкой
    #38884556
Фотография Герой дня
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Объясните, пож-та, почему выдает ошибку:

Ошибка 1 error C2662: int TGAImage::getWidth(void): невозможно преобразовать указатель "this" из "const TGAImage" в "TGAImage &" d:\....\tgaimage.cpp 23 1 ConsoleApplication3

Код: plaintext
1.
2.
3.
4.
5.
6.
TGAImage::TGAImage(const TGAImage &img)
{
	width = img.getWidth(); // так ошибка
	width = img.width; // так без ошибки
	bytesPP = img.bytesPP; 
}



и это притом, что поля у меня защищенные

Код: plaintext
1.
2.
3.
4.
5.
6.
class TGAImage
{
protected: 
	int width;
	int height;
	int bytesPP;



как же тогда я получаю доступ к полю img.width вот здесь:

Код: plaintext
1.
width = img.width; 
...
Рейтинг: 0 / 0
Конструктор с ошибкой
    #38884565
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Герой дня,

1) protected тут вообще не причем

2) Ошибка вызвана тем что img это у вас константная ссылка, а функция getWidth() в этом объекте может быть вызвана только для неконстантных объектов.
Вам надо изменить ее объявление на такое:

Код: plaintext
1.
2.
3.
4.
int getWidth() const
{
...
}



Почитайте про модификатор const для методов класса.
Например тут http://www.parashift.com/c -faq/const-member-fns.html
...
Рейтинг: 0 / 0
Конструктор с ошибкой
    #38884584
Фотография Герой дня
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,

спасибо

а почему получалось достучаться до protected поля ?
...
Рейтинг: 0 / 0
Конструктор с ошибкой
    #38884671
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Герой дняAnatoly Moskovsky,

спасибо

а почему получалось достучаться до protected поля ?


а почему не должно получиться?
поле же не private, к тому же это код данного класса, а не другого, он имеет доступ ко всем полям, в том числе и даже private.
...
Рейтинг: 0 / 0
Конструктор с ошибкой
    #38885006
Фотография Герой дня
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivГерой дняAnatoly Moskovsky,

спасибо

а почему получалось достучаться до protected поля ?


а почему не должно получиться?
поле же не private, к тому же это код данного класса, а не другого, он имеет доступ ко всем полям, в том числе и даже private.

по логике не должно получиться потому, что в метод передается объект по ссылке, это же другой объект, не this

вот поэтому не могу понять причины такого поведения инкапсуляции, ведь у Страуструпа написано:

авторПопулярно следующее толкование защищенных (protected) членов ([Stroustrup3e], 15.3):

Если член защищен, его имя может использоваться только в функциях-членах и друзьях класса, в котором он объявлен, и классов, производных от него .
...
Рейтинг: 0 / 0
Конструктор с ошибкой
    #38885039
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Герой днявот поэтому не могу понять причины такого поведения инкапсуляции, ведь у Страуструпа написано:это потому что ты путаешь объект и экземпляр.
...
Рейтинг: 0 / 0
Конструктор с ошибкой
    #38885375
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Герой дняпо логике не должно получиться потому, что в метод передается объект по ссылке, это же другой объект, не this


Ну а класс-то , класс -- тот же ? Правильно ?
Только один язык в мире так трактует доступ к членам объекта -- Smalltalk.
Ты его изучал как первый ? Сомниваюсь.
А во всех остальных языках программирования члены класса либо вообще не защищены ни от кого, либо защищены
только на основе класса кода, который их использует.

[quot Герой дня]
вот поэтому не могу понять причины такого поведения инкапсуляции, ведь у Страуструпа написано:

авторПопулярно следующее толкование защищенных (protected) членов ([Stroustrup3e], 15.3):

Если член защищен, его имя может использоваться только в функциях-членах и друзьях класса, в котором он объявлен, и классов, производных от него .

Ну, у тебя же как раз такая функция.
TGAImage::TGAImage
Функция класса TGAImage.
width как я понимаю -- член класса TGAImage, нестатический.
...
Рейтинг: 0 / 0
Конструктор с ошибкой
    #38885395
Фотография Герой дня
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

Понятно, то есть внутри класса можно получить доступ к полям объекта этого же класса, даже если они protected
...
Рейтинг: 0 / 0
Конструктор с ошибкой
    #38885401
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Герой дняMasterZiv,

Понятно, то есть внутри класса можно получить доступ к полям объекта этого же класса, даже если они protected

Нифига тебе не понятно. Внутри кода класса можно получить доступ ко всем полям и методам данного класса,
а также к public и protected полям и методам классов-предков.
...
Рейтинг: 0 / 0
Конструктор с ошибкой
    #38885422
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivВнутри кода класса можно получить доступ ко всем полям и методам данного
класса,
Нет. К приватным полям другого экземпляра ты доступа не получишь.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Конструктор с ошибкой
    #38885426
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovНет. К приватным полям другого экземпляра ты доступа не получишь.
Получишь ))
...
Рейтинг: 0 / 0
Конструктор с ошибкой
    #38885445
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyПолучишь ))
Да, если сам себя объявишь френдом. Но это изврат.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Конструктор с ошибкой
    #38885454
RWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
class C {
private:
	int x;
public:
	void assign(C &c) {
		x = c.x;
	}
};
...
Рейтинг: 0 / 0
Конструктор с ошибкой
    #38885455
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovДа, если сам себя объявишь френдом. Но это изврат.
Вам пора освежить знания о С++.
Если все было так как вы пишете, то тривиальный конструктор копирования надо было бы делать через такие извращения, что все бы умерли со смеху ))
...
Рейтинг: 0 / 0
Конструктор с ошибкой
    #38885466
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyВам пора освежить знания о С++.
Нет, мне пора принять таблетки от склероза. Я мучился с copy-конструктором у наследника.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Конструктор с ошибкой
    #38885468
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovНет, мне пора принять таблетки от склероза. Я мучился с copy-конструктором у наследника.
Бывает.
Но в принципе, и там мучений никаких не должно быть: наследник вызывает к-тор предка, а потом копирует свою часть полей.
...
Рейтинг: 0 / 0
Конструктор с ошибкой
    #38885486
Фотография Герой дня
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за ответы
...
Рейтинг: 0 / 0
Конструктор с ошибкой
    #38885712
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovAnatoly MoskovskyПолучишь ))
Да, если сам себя объявишь френдом. Но это изврат.


У вас там что, коллективное помешательство ?
...
Рейтинг: 0 / 0
Конструктор с ошибкой
    #38888932
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Герой дняОбъясните, пож-та, почему выдает ошибку:

Ошибка 1 error C2662: int TGAImage::getWidth(void): невозможно преобразовать указатель "this" из "const TGAImage" в "TGAImage &" d:\....\tgaimage.cpp 23 1 ConsoleApplication3

Код: plaintext
1.
2.
3.
4.
5.
6.
TGAImage::TGAImage(const TGAImage &img)
{
	width = img.getWidth(); // так ошибка
	width = img.width; // так без ошибки
	bytesPP = img.bytesPP; 
}



и это притом, что поля у меня защищенные

Код: plaintext
1.
2.
3.
4.
5.
6.
class TGAImage
{
protected: 
	int width;
	int height;
	int bytesPP;



как же тогда я получаю доступ к полю img.width вот здесь:

Код: plaintext
1.
width = img.width; 





Вы не туда смотрите. все гораздо проще
список для неумолчательной инициализации.
...
Рейтинг: 0 / 0
Конструктор с ошибкой
    #38888937
Фотография Герой дня
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat-,

Не вижу там похожей ситуации
...
Рейтинг: 0 / 0
Конструктор с ошибкой
    #38888996
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Герой дняonstat-,

Не вижу там похожей ситуации

Для того что бы точно понять похожа или нет нужно знать что внутри
width = img.getWidth();

И почему можно или нельзя исопльзовать
width = img.getWidth() const;

Я не понимаю зачем инициализировать поле класса через интерфейс
или через присвоение в теле .
...
Рейтинг: 0 / 0
Конструктор с ошибкой
    #38889010
Фотография Герой дня
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat-,

на случай ловли моментов, когда изменяется поле... а так будете искать по огромному коду место изменения поля

и вот такая запись разрешается

Код: plaintext
1.
width = img.getWidth() const;



?
...
Рейтинг: 0 / 0
Конструктор с ошибкой
    #38889014
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смотри-ка. Сбылось ))
MasterZivНифига тебе не понятно.
...
Рейтинг: 0 / 0
Конструктор с ошибкой
    #38889015
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Герой дняи вот такая запись разрешается

Код: plaintext
1.
width = img.getWidth() const;


?
Нет.
Вот это единственный вариант:
Код: plaintext
1.
width = img.getWidth();
...
Рейтинг: 0 / 0
Конструктор с ошибкой
    #38889019
Фотография Герой дня
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,

спб
...
Рейтинг: 0 / 0
25 сообщений из 30, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Конструктор с ошибкой
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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