Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.75
Миака
0 / 0 / 0
Регистрация: 17.10.2011
Сообщений: 19
17.10.2011, 12:47     Как переделать класс из обычного в абстрактный? #1
Значит дело вот в чем. Есть обычный класс. Написанный полностью и работает хорошо. Но нужно сделать из него абстрактный. Что нужно в него добавить чтобы он таковым считался?
Была бы очень благодарна за помощь.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.10.2011, 12:47     Как переделать класс из обычного в абстрактный?
Посмотрите здесь:

C++ Абстрактный класс
Написать обработчик исключений ситуации при преобразовании указателя на класс B до указателя на абстрактный класс А ... C++
Как реализовать данный абстрактный класс? C++
абстрактный класс как реализовать данные, над которыми методы выполняют какие-либо действия C++
Как объявить функцию, которая имеет место быть только в некоторых дочерних классах, а базовый класс абстрактный? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 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
Регистрация: 17.10.2011
Сообщений: 19
17.10.2011, 13:55  [ТС]     Как переделать класс из обычного в абстрактный? #22
fasked, у нее в методичке виртуальный деструктор вообще записан как
virtual ~vector ()
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
17.10.2011, 13:55     Как переделать класс из обычного в абстрактный? #23
Цитата Сообщение от fasked Посмотреть сообщение
Так пользоваться все равно не получится таким классом.


Цитата Сообщение от fasked Посмотреть сообщение
Как работоспособность класса-то демонстрировать? И если это вектор, то память как чистить, которая по идее должна выделяться в конструкторе?
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
17.10.2011, 13:58     Как переделать класс из обычного в абстрактный? #24
Цитата Сообщение от Миака Посмотреть сообщение
у нее в методичке виртуальный деструктор вообще записан как
virtual ~vector ()
Все верно у нее написано это я сгоряча слово "virtual" забыл. Но, это только виртуальный деструктор и он не делает класс абстрактным. Чтобы сделать класс абстрактным надо дообавить "= 0;".
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
17.10.2011, 14:01     Как переделать класс из обычного в абстрактный? #25
LosAngeles, интересно. А откуда такая цитата?
LosAngeles
Заблокирован
17.10.2011, 14:06     Как переделать класс из обычного в абстрактный? #26
gooseim, из стандарта. Формально из финального драфта С++11, но в 2003 написано тоже самое, но его у меня нет
Миака
0 / 0 / 0
Регистрация: 17.10.2011
Сообщений: 19
17.10.2011, 14:07  [ТС]     Как переделать класс из обычного в абстрактный? #27
fasked, а если дописать просто чистую виртуальную функцию,а не деструктор,тоже работать не будет?
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 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 метод, который расчитывает количество памяти. Получилось бы куда более интересней.
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
17.10.2011, 14:25     Как переделать класс из обычного в абстрактный? #29
LosAngeles, а не знаете, с чем это связано. Почему нельзя, чтобы была одна функция?
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
17.10.2011, 14:30     Как переделать класс из обычного в абстрактный? #30
Цитата Сообщение от gooseim Посмотреть сообщение
а не знаете, с чем это связано. Почему нельзя, чтобы была одна функция?
it has at least one - имеет по крайнем мере/как минимум/хотя бы одну.
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
17.10.2011, 14:36     Как переделать класс из обычного в абстрактный? #31
fasked,
спасибо, надо учить английский.
Миака
0 / 0 / 0
Регистрация: 17.10.2011
Сообщений: 19
17.10.2011, 15:34  [ТС]     Как переделать класс из обычного в абстрактный? #32
fasked, спасибо,буду пытаться сделать)
Сыроежка
Заблокирован
17.10.2011, 17:44     Как переделать класс из обычного в абстрактный? #33
Цитата Сообщение от gooseim Посмотреть сообщение
LosAngeles, а не знаете, с чем это связано. Почему нельзя, чтобы была одна функция?
Это связано лишь с одним: вы не знаете раздела С++, касающегося абстрактных классов! Только и всего!
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
17.10.2011, 17:58     Как переделать класс из обычного в абстрактный? #34
Сыроежка, точно. Только и всего.
Сыроежка
Заблокирован
17.10.2011, 18:17     Как переделать класс из обычного в абстрактный? #35
Цитата Сообщение от gooseim Посмотреть сообщение
Сыроежка, точно. Только и всего.
На самом деле эта общая проблема, состоящая в том, что знания черпаются обычно из различных книг по С++. Когда пишут книги, то очевидно включают лишь тот материал, который считает нужным включить сам автор. А это приводит к тому, что авторы обычно выборочно выбирают материал, и многое остается "за бортом" книги. К тому же проблему усугубляют переводчики, которые порой неправильно передают контекст той или иной фразы. Поэтому действительно можно воспринять информацию об абстрактных классах так, как будто бы все функции должны быть чисто виртуальными.

Я приведу пример подобного заблуждения, который я уже ранее приводил, что многие не знали и не знают, что дружественные функции можно определять внутри класса, который "предоставляет" дружбу, если этот класс не локальный. Но самое забавное, что MS VC++ 2010 содержит баг, не позволяющий определять дружественные функции внутри класса.
В книгах про это тоже обычно нельзя вычитать.
aeshes
 Аватар для aeshes
437 / 200 / 13
Регистрация: 07.10.2011
Сообщений: 462
17.10.2011, 21:43     Как переделать класс из обычного в абстрактный? #36
Сыроежка,
Цитата Сообщение от Сыроежка Посмотреть сообщение
Но самое забавное, что MS VC++ 2010 содержит баг, не позволяющий определять дружественные функции внутри класса.
MS VC2010 позволяет определить дружественную функцию внутри класса, т.е. код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
using namespace std;
 
class A
{
    int x;
public:
    A(int _x=0) {x=_x;}
    friend void print(A a)
    {
        cout<<a.x<<endl;
    }
};
 
int main(void)
{
    A a(17);
    print(a);
}
компилируется в вижуалах
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.10.2011, 03:28     Как переделать класс из обычного в абстрактный?
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
LosAngeles
Заблокирован
18.10.2011, 03:28     Как переделать класс из обычного в абстрактный? #37
у вижуала много проблем особенно шаблонами, вот например не компилируется простенький код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
namespace X
{
template <unsigned N>
void f();
}
 
template <unsigned N>
struct A
{
    friend void X::f <N> ();
};
 
int main ()
{
return 0;
}
Yandex
Объявления
18.10.2011, 03:28     Как переделать класс из обычного в абстрактный?
Ответ Создать тему
Опции темы

Текущее время: 16:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru