Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Абстрактный класс 
V
    Опции темы
Sheff
Дата 23.7.2006, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 503
Регистрация: 25.3.2002
Где: Зеленоград

Репутация: 3
Всего: 3



Вобщем, есть класс:
Код

class Class
{
public:
    Class() {}
    virtual ~Class() = 0;

    void someNonVirtualFunction()
                { 
                 ///Do something
    }

private:
    SomeData someMember;

};

Я хочу сделать так, чтобы этот класс бы абстрактным, для этого нужно хотя бы у одной функции написать "= 0;"
Но у меня таких функций нет, т.к единственная функция someNonVirtualFunction() не виртуальная и если бы даже она была виртуальной
я не хочу делать её чисто виртуальной. Поэтому я пишу virtual ~Class() = 0; чтобы указать абстрактность класса. Но такой код не компилируется, т.к нужно написать тело ~Class(), пусть и пустое. И вот вопрос, где мне его написать, если напишу в хэдэре, линкер будет ругаться, т.к при включении заголовка в разные модули будет ошибка(тело для одной функции написано несколько раз). Другой вариант - вынести в cpp, чего тоже делать не хочется, т.к Class - это интерфейс, следовательно реализации для него быть не должно, cpp меня не устраивает. В Visual C++ можно написать так: virtual ~Class() = 0 {}. И тогда всё прокатит, но GCC не понимает такой синтаксис, а я пишу кроссплатформенное приложение, не подскажете как мне быть ?

 


--------------------
--------------------------
Шеф всегда прав :)
PM MAIL WWW ICQ   Вверх
Daevaorn
Дата 23.7.2006, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(Sheff @  23.7.2006,  15:54 Найти цитируемый пост)
 Class - это интерфейс, следовательно реализации для него быть не должно

А зачем класс-интерфейс без виртуальных функций?!
Цитата(Sheff @  23.7.2006,  15:54 Найти цитируемый пост)
т.к единственная функция someNonVirtualFunction() не виртуальная и если бы даже она была виртуальной
я не хочу делать её чисто виртуальной

Даже для чисто виртуальных функций можно писать тело.
Цитата(Sheff @  23.7.2006,  15:54 Найти цитируемый пост)
В Visual C++ можно написать так: virtual ~Class() = 0 {}. И тогда всё прокатит, но GCC не понимает такой синтаксис, а я пишу кроссплатформенное приложение, не подскажете как мне быть ?

Здаётся мне, что ты хочешь перехитрить сам себя. Всё должно работать нормально. 
PM MAIL WWW   Вверх
Sheff
Дата 23.7.2006, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 503
Регистрация: 25.3.2002
Где: Зеленоград

Репутация: 3
Всего: 3



Daevaorn, я немного не так выразился, это не интерфейс, но если бы даже он и был интерфейсом проблему не решить.
Я знаю что для чисто вирт. функции можно написать тело, но мне это не нужно.
Цитата

Здаётся мне, что ты хочешь перехитрить сам себя. Всё должно работать нормально. 

Нет, этот синтаксис GCC не понимает.

Вобщем, всё что мне нужно, это чтобы класс был абстрактным и не нужно было писать cpp для него. 


--------------------
--------------------------
Шеф всегда прав :)
PM MAIL WWW ICQ   Вверх
Daevaorn
Дата 23.7.2006, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(Sheff @  23.7.2006,  16:15 Найти цитируемый пост)
Нет, этот синтаксис GCC не понимает

Да. Проверил.
Цитата(Sheff @  23.7.2006,  16:15 Найти цитируемый пост)
Вобщем, всё что мне нужно, это чтобы класс был абстрактным и не нужно было писать cpp для него

Допиши реализацию пустого деструтора после объявления класса и поставь inline 
PM MAIL WWW   Вверх
Sheff
Дата 23.7.2006, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 503
Регистрация: 25.3.2002
Где: Зеленоград

Репутация: 3
Всего: 3



Спасибо огромное!!! + в репутацию smile

Добавлено @ 16:33 
А нет, не выйдет, Админ почему-то запретил мне менять репутацию других пользователей. Провинился видимо ;) 


--------------------
--------------------------
Шеф всегда прав :)
PM MAIL WWW ICQ   Вверх
Mayk
Дата 23.7.2006, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(Daevaorn @  23.7.2006,  19:29 Найти цитируемый пост)
Допиши реализацию пустого деструтора после объявления класса и поставь inline 

А зачем inline? Виртуальные ф-ции навряд ли будут на деле inline'ными.

Цитата(Sheff @  23.7.2006,  20:32 Найти цитируемый пост)
А нет, не выйдет, Админ почему-то запретил мне менять репутацию других пользователей. Провинился видимо ;)  

Поставил. 


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Daevaorn
Дата 23.7.2006, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(Mayk @  23.7.2006,  20:11 Найти цитируемый пост)
А зачем inline? Виртуальные ф-ции навряд ли будут на деле inline'ными.

Бесспорно. Но это хороший способ заставить замолчать линкер. Если написать реализацию сразу - то это ill-formed code и по стандарту, и по мнению gcc. 
PM MAIL WWW   Вверх
Mayk
Дата 23.7.2006, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(Daevaorn @  24.7.2006,  00:07 Найти цитируемый пост)
Бесспорно. Но это хороший способ заставить замолчать линкер.

(перечитал сообщения ещё раз)
Извиняюсь, туплю. Пропустил что имелось в виду написание реализации в заголовочном файле, а не в .cpp
Цитата(Daevaorn @  23.7.2006,  19:29 Найти цитируемый пост)
реализацию пустого деструтора после объявления класса и


 


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Sheff
Дата 24.7.2006, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 503
Регистрация: 25.3.2002
Где: Зеленоград

Репутация: 3
Всего: 3



Цитата(Mayk @  23.7.2006,  19:11 Найти цитируемый пост)
Поставил.

Неа, всё равно не могу =(

Добавлено @ 21:39 
А, понял, ты за меня поставил =)

Добавлено @ 21:40 
Интересно, а почему я сам не могу этого делать, я просто давно не был на этом форуме, тут новые правила ? 


--------------------
--------------------------
Шеф всегда прав :)
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0764 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.