![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Neitron |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 580 Регистрация: 3.10.2005 Где: Москва Репутация: 2 Всего: 5 |
Собсно вот код
До появления виртуальной ф-ции.. работало все как нужно... Я конечно могу сделать переопределение ф-ции, и тогда опять будет работать все как нужно, но мне бы хотелось не занимать этими ф-циями "лишнюю" память.... Это сообщение отредактировал(а) Neitron - 2.12.2005, 12:18 -------------------- Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей. Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ |
|||
|
||||
srd |
|
|||
![]() Нереварин ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 951 Регистрация: 30.8.2003 Где: Владивосток Репутация: 27 Всего: 49 |
Не понятно, чего хочешь добиться. Класс А является абстрактным, потому класс С не может содержать экземпляров класса А.
-------------------- Не смей читать мою подпись!!! |
|||
|
||||
Neitron |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 580 Регистрация: 3.10.2005 Где: Москва Репутация: 2 Всего: 5 |
Если сделать так.
То конструктор С() Покажет сообщение. Но A::f() существует, и занимает память... Мне нужен экземпляр класса B Но чтобы знал он о методах только класса A.
По-моему конструктор класса C вполне ясно говорит чего я хочу. Это сообщение отредактировал(а) Neitron - 2.12.2005, 12:35 -------------------- Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей. Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ |
||||
|
|||||
chipset |
|
||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 165 |
Там занимать нечему, функции ж не копируються в каждый экземпляр класса.
Малость не врубаюсь я, а как ты хочешь проделать эту операцию
без A::f? O_O --------------------
|
||||||
|
|||||||
Neitron |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 580 Регистрация: 3.10.2005 Где: Москва Репутация: 2 Всего: 5 |
chipset
Объясняю f() виртуальная и определянеся ри создании класса, через класс B... Вообщем я понел, что без указателей это сделать невозможно.А жаль. -------------------- Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей. Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ |
|||
|
||||
_hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
конструктор-то говорит, но о чем он говорит ты, похоже, не знаеш...
+ класс B и так знает только о методах класса А ( ну и о своих ) -- о методах класса С он не знает ( если ты это имел в виду ) -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
Neitron |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 580 Регистрация: 3.10.2005 Где: Москва Репутация: 2 Всего: 5 |
Не совсем
После этого существует две ф-ции A::f() и B::f() При использовании виртуальных ф-ций cуществует только B::f() он обратится можно к ней и из класса A Это сообщение отредактировал(а) Neitron - 2.12.2005, 12:42 -------------------- Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей. Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ |
||||
|
|||||
_hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
это и так понятно... а чем тебя это не устраивает/что ты хочеш изменить? -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
Neitron |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 580 Регистрация: 3.10.2005 Где: Москва Репутация: 2 Всего: 5 |
Я хочу чтобы это работало... Это не компилируется.!
Видимо придется делать так...
В этом случае придется заботится об удалении объекта... А я это делать не хотел... Нужен код, который выше. Это сообщение отредактировал(а) Neitron - 2.12.2005, 12:45 -------------------- Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей. Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ |
|||
|
||||
_hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
если не объявиш а абстрактным -- тоже две функции будут _существовать_...
что тебе нужно так и не понял... Добавлено @ 12:50 что такое virtual ~f(){}; ? + напиши не "хочу чтобы скомпилировалось" а задачу... ++ в чем проблема с "заботой об удалении"? -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
Neitron |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 580 Регистрация: 3.10.2005 Где: Москва Репутация: 2 Всего: 5 |
Я знаю все о чем говорит конструктор.
Я хочу чтобы "a" знал только о методах A, но был создал при помощи B Без указателей... Забей на virtual ~f(){}; Я показал тот код который мне нужен. В Виде указателей, хочу чтобы это было без указателей. Это сообщение отредактировал(а) Neitron - 2.12.2005, 12:52 -------------------- Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей. Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ |
|||
|
||||
srd |
|
||||
![]() Нереварин ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 951 Регистрация: 30.8.2003 Где: Владивосток Репутация: 27 Всего: 49 |
Можно и не заботиться...
Или использовать ссылки -------------------- Не смей читать мою подпись!!! |
||||
|
|||||
Neitron |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 580 Регистрация: 3.10.2005 Где: Москва Репутация: 2 Всего: 5 |
![]() ![]() ![]() Только я это уже сам понел=)))) Пока я тут спорил, мне пришла в голову мысль о ссылка и уже минут 10 у меня компилируется проект и я ждал выдаст он ошибку или нет...
Всем спасибо. Как всегда никто не помог вовремя... Это сообщение отредактировал(а) Neitron - 2.12.2005, 12:55 -------------------- Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей. Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ |
||||
|
|||||
srd |
|
|||
![]() Нереварин ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 951 Регистрация: 30.8.2003 Где: Владивосток Репутация: 27 Всего: 49 |
Это у тебя фигня получилась. Неконстантные ссылки на временный объекты создавать нельзя.
-------------------- Не смей читать мою подпись!!! |
|||
|
||||
Neitron |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 580 Регистрация: 3.10.2005 Где: Москва Репутация: 2 Всего: 5 |
Почему временный?
Объект существует пока существует класс или я не прав? Не проблема сделать её константной... -------------------- Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей. Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ |
|||
|
||||
srd |
|
||||||
![]() Нереварин ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 951 Регистрация: 30.8.2003 Где: Владивосток Репутация: 27 Всего: 49 |
Здесь B() создаёт временный объект, которым ты пытаешься проинициализировать неконстантую ссылку, что запрещено.
По идее, надо так:
gcc это компилирует, и получаемая программа работает правильно. А вот VC7.1 скомпилировать такой код не может:
-------------------- Не смей читать мою подпись!!! |
||||||
|
|||||||
Neitron |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 580 Регистрация: 3.10.2005 Где: Москва Репутация: 2 Всего: 5 |
Когда я делаю так..
Билдер ругается на то что я вызываю не константные ф-ции... Может тогда так?
Ф-ции не могут у меня быть константными. Что-то ты хитришь, я не понимаю что ужасного в моем коде? Никаких предупреждений у меня билдер вообще не пишит. Очень хочу разобраться в этом моменте... Это сообщение отредактировал(а) Neitron - 2.12.2005, 14:43 -------------------- Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей. Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ |
||||
|
|||||
Neitron |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 580 Регистрация: 3.10.2005 Где: Москва Репутация: 2 Всего: 5 |
Может это недостаток компилера от мелкомягких?
Это сообщение отредактировал(а) Neitron - 2.12.2005, 14:56 -------------------- Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей. Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ |
|||
|
||||
Neitron |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 580 Регистрация: 3.10.2005 Где: Москва Репутация: 2 Всего: 5 |
Пришел к выводу, что лучше буду использовать указатели.
-------------------- Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей. Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ |
|||
|
||||
Vyacheslav |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 9 Всего: 59 |
А чeм тут поможет константная ссылка? В любом случае это ошибка - инициализировать ссылку временным объектом, который к тому моменту, когда им пытаются воспользоваться посредством ссылки уже уничтожен. И сработала или не сработала программа - это не аргумент, по скольку при уничтожении объекта память не обязана быть очищена, то в приниципе код может и сработать на уничтоженном объекте -------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
srd |
|
|||
![]() Нереварин ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 951 Регистрация: 30.8.2003 Где: Владивосток Репутация: 27 Всего: 49 |
Константная ссылка продлевает время жизни временного объекта. Пока ссылка не выйдет из области видимости, временный объект живёт. -------------------- Не смей читать мою подпись!!! |
|||
|
||||
blackofe |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 173 Регистрация: 29.11.2005 Репутация: 4 Всего: 4 |
Neitron
не пойму, чем ты компилируешь. у меня vc++ выдал сразу две ошибки на строку:
error C2354: 'C::a' : initialization of reference member requires a temporary variable error C2439: 'C::a' : member could not be initialized что совершенно справедливо: выполнение нестатического метода требует наличие временного (хотя бы) объекта, а ты не можешь его создать, потому что A - класс абстрактный. Добавлено @ 21:02 упс. пропустил продолжение темы ![]() Добавлено @ 21:04
рассудим логически. ты хочешь, чтобы a знал только о методах A, но ведь среди методов A есть чисто виртуальные! как ты объяснишь компилятору, что они должны делать? Это сообщение отредактировал(а) blackofe - 2.12.2005, 21:09 |
||||
|
|||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Неконстантный временный объект живет ровно столько же, просто некоторые компиляторы запрещают создание неконстантных временных объектов, справедливо считая это небезопасным. Во время работы конструктора a показывает на существующий (временный !)объект, и код отработает. Но потом-то а останется в классе! И будет показывать на мусор. Если нужно, чтобы код отработал только в конструкторе, заведи в нем локальную переменную И и сделай вызов. Ссылка или указатель должны куда-то указывать - т.е. объект нужно где-то хранить - либо динамическое выделение памяти (с последующим освобождением), либо включить объект B внутрь класса C и присвоить a ссылку на него... -------------------- ... |
|||
|
||||
Neitron |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 580 Регистрация: 3.10.2005 Где: Москва Репутация: 2 Всего: 5 |
Я хотел делать это также как мог делать в этом коде...
Но я уже уловил суть.... То что я хотел, этого видимо не сделать.... Earnest Я давно сам в этом разобрался. Это сообщение отредактировал(а) Neitron - 5.12.2005, 11:19 -------------------- Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей. Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |