Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.75
Миака
0 / 0 / 0
Регистрация: 17.10.2011
Сообщений: 19
#1

Как переделать класс из обычного в абстрактный? - C++

17.10.2011, 12:47. Просмотров 1628. Ответов 36
Метки нет (Все метки)

Значит дело вот в чем. Есть обычный класс. Написанный полностью и работает хорошо. Но нужно сделать из него абстрактный. Что нужно в него добавить чтобы он таковым считался?
Была бы очень благодарна за помощь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.10.2011, 12:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как переделать класс из обычного в абстрактный? (C++):

Абстрактный класс, как аргумент функции - C++
добрый день. есть базовый класс Tag внем строковое поле Name есть производные от него класы SmplTag со строковым полем Value и класс...

Как реализовать данный абстрактный класс? - C++
Создать абстрактный класс Function с методом вычисления значения функции y=f(x) в заданной точке. Создать производные классы: Line...

Класс: Создать абстрактный базовый класс Figure с виртуальными методами вычисления площади и периметра. - C++
Создать абстрактный базовый класс Figure с виртуальными методами вычисления площади и периметра. Создать производные классы: Rectangle...

Абстрактный класс, наследование, класс хранится в другом классе - C++
Нужна помощь. Написать программу: 1 класс. Имеется абстрактный класс который описывает какую-то сущность, например Человек. В абстрактном...

абстрактный класс как реализовать данные, над которыми методы выполняют какие-либо действия - C++
Абстрактный класс как реализовать данные, над которыми методы выполняют какие-либо действия Задание: форматированный ввод и вывод...

Объясните как объявить абстрактный класс, и при этом не тащить виртуальные методы в производные классы - C++
Суть вопроса - есть у меня класс, который я решаю сделать абстрактным. Как я понимаю что бы сделать класс абстрактным необходимо просто...

36
fasked
Эксперт С++
4948 / 2528 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
17.10.2011, 13:43 #16
Цитата Сообщение от Миака Посмотреть сообщение
но если предположить, что абстрактный тип данных, то что тогда?
Тогда Ваше задание можно считать выполненным Фактически любой класс с методами можно считать АТД.
0
PointsEqual
ниначмуроФ
836 / 520 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
17.10.2011, 13:44 #17
Если нет функций, которые можно сделать чисто виртуальными, а в универе сказали НАДО сделать абстрактным, то делай чисто виртуальным деструктор ~)
0
Миака
0 / 0 / 0
Регистрация: 17.10.2011
Сообщений: 19
17.10.2011, 13:45  [ТС] #18
fasked, ну преподаватель посмотрела и сказала "он не абстрактный". Поэтому я пожалуй на самом деле просто допишу пустую функцию, как посоветовал LosAngeles, и пусть он визуально выглядит как абстрактный класс)

Спасибо большое)

Добавлено через 36 секунд
PointsEqual, о, тоже хорошая идея) Спасибо)
0
fasked
Эксперт С++
4948 / 2528 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
17.10.2011, 13:49 #19
Цитата Сообщение от PointsEqual Посмотреть сообщение
Если нет функций, которые можно сделать чисто виртуальными, а в универе сказали НАДО сделать абстрактным, то делай чисто виртуальным деструктор ~)
Так пользоваться все равно не получится таким классом. Это в любом случае будет только интерфейс. Как работоспособность класса-то демонстрировать? И если это вектор, то память как чистить, которая по идее должна выделяться в конструкторе?
0
Миака
0 / 0 / 0
Регистрация: 17.10.2011
Сообщений: 19
17.10.2011, 13:51  [ТС] #20
Цитата Сообщение от fasked Посмотреть сообщение
Так пользоваться все равно не получится таким классом. Это в любом случае будет только интерфейс. Как работоспособность класса-то демонстрировать?
У нас преподаватель очень формально смотрит, главное, чтобы программа что-нибудь выводила и, соответственно, запускалась, детально в то, что там работает и как она никогда не всматривалась)
0
fasked
Эксперт С++
4948 / 2528 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
17.10.2011, 13:53 #21
Цитата Сообщение от Миака Посмотреть сообщение
У нас преподаватель очень формально смотрит, главное, чтобы программа что-нибудь выводила и, соответственно, запускалась, детально в то, что там работает и как она никогда не всматривалась
C++
1
2
3
4
5
6
7
8
9
10
11
class vector {
public:
    ~vector() = 0;
 
// some code
// ...
};
 
int main() {
    vector v;
}
Однозначная ошибка компиляции. Наследоваться придется хотя бы только для того, чтобы показать, что программа вообще компилируется
0
Миака
0 / 0 / 0
Регистрация: 17.10.2011
Сообщений: 19
17.10.2011, 13:55  [ТС] #22
fasked, у нее в методичке виртуальный деструктор вообще записан как
virtual ~vector ()
0
PointsEqual
ниначмуроФ
836 / 520 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
17.10.2011, 13:55 #23
Цитата Сообщение от fasked Посмотреть сообщение
Так пользоваться все равно не получится таким классом.


Цитата Сообщение от fasked Посмотреть сообщение
Как работоспособность класса-то демонстрировать? И если это вектор, то память как чистить, которая по идее должна выделяться в конструкторе?
0
fasked
Эксперт С++
4948 / 2528 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
17.10.2011, 13:58 #24
Цитата Сообщение от Миака Посмотреть сообщение
у нее в методичке виртуальный деструктор вообще записан как
virtual ~vector ()
Все верно у нее написано это я сгоряча слово "virtual" забыл. Но, это только виртуальный деструктор и он не делает класс абстрактным. Чтобы сделать класс абстрактным надо дообавить "= 0;".
0
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
17.10.2011, 14:01 #25
LosAngeles, интересно. А откуда такая цитата?
0
LosAngeles
Заблокирован
17.10.2011, 14:06 #26
gooseim, из стандарта. Формально из финального драфта С++11, но в 2003 написано тоже самое, но его у меня нет
0
Миака
0 / 0 / 0
Регистрация: 17.10.2011
Сообщений: 19
17.10.2011, 14:07  [ТС] #27
fasked, а если дописать просто чистую виртуальную функцию,а не деструктор,тоже работать не будет?
0
fasked
Эксперт С++
4948 / 2528 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
17.10.2011, 14:22 #28
Цитата Сообщение от Миака Посмотреть сообщение
а если дописать просто чистую виртуальную функцию,а не деструктор,тоже работать не будет?
Как уже не раз было сказано выше, невозможно создать экземпляр абстрактного класса. Попытки создать такой экземпляр всегда будут приводить к ошибкам компиляции. Можно наследоваться и создавать объекты наследуемого класса, можно сделать в абстрактном функцию print чисто виртуальной, а в дочерних классах ее переопределять нужным образом.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class vector {
public:
    virtual void print() = 0;
};
 
class vector_console : public vector {
public:
    void print() {
        // for (...)
        //    std::cout << ...
    }
};
 
class vector_logfile : public vector {
public:
    void print() {
        // std::ofstream ofs ...
        // for (...)
        //    ofs << ...
    }
};
 
int main() {
    vector vb; // error
    vector_console vc; // ok
}
Хотя это решение весьма уродливое. Лучше переопределить что-то другое.
Например, если вектор может выделять памяти больше, чем надо в текущий момент, тогда можно было бы выделить как pure-virtual метод, который расчитывает количество памяти. Получилось бы куда более интересней.
0
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
17.10.2011, 14:25 #29
LosAngeles, а не знаете, с чем это связано. Почему нельзя, чтобы была одна функция?
0
fasked
Эксперт С++
4948 / 2528 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
17.10.2011, 14:30 #30
Цитата Сообщение от gooseim Посмотреть сообщение
а не знаете, с чем это связано. Почему нельзя, чтобы была одна функция?
it has at least one - имеет по крайнем мере/как минимум/хотя бы одну.
1
17.10.2011, 14:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.10.2011, 14:30
Привет! Вот еще темы с ответами:

Как объявить функцию, которая имеет место быть только в некоторых дочерних классах, а базовый класс абстрактный? - C++
Как объявить функцию, которая имеет место быть только в некоторых дочерних классах? Например //Абстрактный базовый класс ...

Создать абстрактный базовый класс Тройка чисел с виртуальными методами увеличения на 1. Создать производный класс Время со своими функциями - C++
Здравствуйте, пожалуйста помогите написать код к данной задаче, с таким условием: Создать абстрактный базовый класс Тройка чисел с...

Написать обработчик исключений ситуации при преобразовании указателя на класс B до указателя на абстрактный класс А ... - C++
Написать обработчик исключений ситуации при преобразовании указателя на класс B до указателя на абстрактный класс А ... как сделать...

Абстрактный класс/Класс интерфейс - C++
Не ловлю суть в чем разница между интерфейсом и абстрактным классом. И там и там у методов нету реализации. Ну интерфейс задает набор...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru