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

Абстрактные классы, наследование - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 30, средняя оценка - 4.80
Norka
0 / 0 / 0
Регистрация: 14.04.2011
Сообщений: 3
14.04.2011, 16:21     Абстрактные классы, наследование #1
Задание: Написать базовый абстрактный класс «фигура» (с чистыми виртуальными функциями: нарисовать, передвинуть, повернуть) и два класса наследника окружность и квадрат, с различной реализацией этих функций. В основной программе создать массив указателей базового класса на объекты классов наследников. Передвинуть все объекты на одинаковое расстояние.

Помогите плиз, кто чем может=)

Добавлено через 2 часа 9 минут
Up, все еще нужна помощь...Заоранее благодарен
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.04.2011, 16:21     Абстрактные классы, наследование
Посмотрите здесь:

Наследование, абстрактные классы. C++
C++ наследование и абстрактные классы!!
C++ абстрактные классы
C++ Абстрактные классы
C++ Абстрактные классы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IrineK
Заблокирован
14.04.2011, 16:36     Абстрактные классы, наследование #2
Дейтель, Харви и Пол. Как программировать на С++
Глава 10.9. Очень близкий пример.
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
14.04.2011, 18:50     Абстрактные классы, наследование #3
квадрат
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include<iostream>
#include<windows.h>
 
class Shape{
    protected:
        int rotated;
        int shifted;
    public:
        Shape():rotated(0), shifted(0){}
        virtual void Draw(int)=0;
        virtual void Rotate(int)=0;
        virtual void Shift(int)=0;
        int GetRotated(){return rotated;}
        int GetShifted(){return shifted;}
};
 
class Square:public Shape{
    private:
        int length;
    public:
        Square():Shape(), length(0){}
        void Draw(int);
        void Rotate(int);
        void Shift(int);
        int GetLength(){return length;}
};
 
void Square::Draw(int ini){
    length=ini;
    std::cout<<"Нарисован квадрат со стороной "<<ini<<"\n";
}
void Square::Rotate(int ini){
    rotated+=ini;
    std::cout<<"Квадрат повёрнут на "<<ini<<"\n";
}
void Square::Shift(int ini){
    shifted+=ini;
    std::cout<<"Квадрат сдвинут на "<<ini<<"\n";
}
 
int main(){
    SetConsoleOutputCP(1251);
    int size=3;
    Shape* arr[size];
    for(int i=0; i<size; i++){
        arr[i]=new Square();
        arr[i]->Draw(10);
        arr[i]->Shift(5);
    }
    for(int i=0; i<size; i++){
        delete arr[i];
        arr[i]=NULL;
    }
    return 0;
}
Norka
0 / 0 / 0
Регистрация: 14.04.2011
Сообщений: 3
15.04.2011, 15:47  [ТС]     Абстрактные классы, наследование #4
Благодарю, но возник еще вопросик...
Компилятор ругается на строчку
C#
1
Shape* arr[size];
Пишит что хочет константное вырожение, ну если сделать константу то все работает, а как сделать не константой?
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
15.04.2011, 16:06     Абстрактные классы, наследование #5
C++
1
Shape *arr = new Shape[size];
Ma3a
Эксперт C++
612 / 456 / 31
Регистрация: 28.01.2011
Сообщений: 605
15.04.2011, 16:09     Абстрактные классы, наследование #6
outoftime, тогда скорее вот так
C++
1
Shape ** arr = new Shape*[size];
Lavios
62 / 62 / 2
Регистрация: 27.01.2011
Сообщений: 250
15.04.2011, 16:25     Абстрактные классы, наследование #7
Для справки первый вариант не работает=) Второй нормальный=)
Norka
0 / 0 / 0
Регистрация: 14.04.2011
Сообщений: 3
15.04.2011, 16:25  [ТС]     Абстрактные классы, наследование #8
Спасибо всем=) Все работает
Ma3a
Эксперт C++
612 / 456 / 31
Регистрация: 28.01.2011
Сообщений: 605
15.04.2011, 16:25     Абстрактные классы, наследование #9
Norka, не забудьте только потом соответствующие delete для освобождения памяти поставить.
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
15.04.2011, 16:38     Абстрактные классы, наследование #10
Ma3a, не знаешь, если есть вектор
C++
1
vector<vector<Cell *>> *m_cells;
Можно освобождать его так:
C++
1
m_cells->clear();
Или надо очищать вручную все указатели на классы? (точнее память под классы, на которые указывают указатели)
Ma3a
Эксперт C++
612 / 456 / 31
Регистрация: 28.01.2011
Сообщений: 605
15.04.2011, 16:43     Абстрактные классы, наследование #11
outoftime, очищать указатели надо вручную.

Добавлено через 3 минуты
или как вариант сделать std::vector<std::vector<std::auto_ptr<Cell> > >, тогда можно и вызовом clear() очищать, при очистке вектора будут вызваны деструкторы для каждого auto_ptr и память из под объектов освободится автоматически.
Mr.X
Эксперт С++
 Аватар для Mr.X
2807 / 1583 / 248
Регистрация: 03.05.2010
Сообщений: 3,688
15.04.2011, 16:51     Абстрактные классы, наследование #12
Цитата Сообщение от Ma3a Посмотреть сообщение
или как вариант сделать std::vector<std::vector<std::auto_ptr<Cell> > >, тогда можно и вызовом clear() очищать, при очистке вектора будут вызваны деструкторы для каждого auto_ptr и память из под объектов освободится автоматически.
Объекты std::auto_ptr нельзя хранить в стандартных контейнерах из-за побочных эффектов при их копировании и писваивании.
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
15.04.2011, 16:53     Абстрактные классы, наследование #13
Ma3a, А можно как-то модифицировать вызов деструкторов, что-бы удалять данный по ссылке?
Ma3a
Эксперт C++
612 / 456 / 31
Регистрация: 28.01.2011
Сообщений: 605
15.04.2011, 16:55     Абстрактные классы, наследование #14
Mr.X, точно, совсем из головы вылетело
тогда насколько я знаю только boost::shared_ptr поможет

Добавлено через 2 минуты
outoftime, не слишком ясно, о чем вы, но если по поводу моего поста с auto_ptr, то это я погорячился, лучше оставьте пока обычные указатели и потом просто вручную освободите указатели.
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
15.04.2011, 21:45     Абстрактные классы, наследование #15
Можете пример с boost::shared_ptr навести?
Ma3a
Эксперт C++
612 / 456 / 31
Регистрация: 28.01.2011
Сообщений: 605
15.04.2011, 22:08     Абстрактные классы, наследование #16
В целом по работе похоже на auto_ptr, только реализован изнутри он по-другому и там подсчет ссылок есть
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void DoSmth()
{
    typedef boost::shared_ptr<int> SPtr;
 
    std::vector<SPtr> vect;
 
    // довавление элементов в вектор...
    SPtr p(new int(1));
    vect.push_back(p);
 
    p.reset(new int(2));
    vect.push_back(p);
    ...
    // получение объекта из shared_ptr
    int i = *p.get();
    ...
} // а здесь всё нормально очищается, даже если где-то при операциях возникло исключение
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.04.2011, 22:16     Абстрактные классы, наследование
Еще ссылки по теме:

Абстрактные классы C++
C++ Абстрактные классы
Абстрактные классы. Наследование C++

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

Или воспользуйтесь поиском по форуму:
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
15.04.2011, 22:16     Абстрактные классы, наследование #17

Не по теме:

человек динамические массивы не осилил, а вы shared_ptr


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <memory>
#include <iostream>
#include <vector>
 
#define I_D std::cout << __FUNCTION__ << " (" << __LINE__ << ") " << __FILE__ << " " << std::endl;
 
class A
{
public:
   A(){ I_D; }
   ~A(){ I_D; } 
};
 
int main()
{
   std::vector<std::shared_ptr<A> > v
      = {
          std::shared_ptr<A>(new A),
          std::shared_ptr<A>(new A),
          std::shared_ptr<A>(new A),  
        };
}
Yandex
Объявления
15.04.2011, 22:16     Абстрактные классы, наследование
Ответ Создать тему
Опции темы

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