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

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

Войти
Регистрация
Восстановить пароль
 
arhistratig13
25 / 18 / 2
Регистрация: 18.06.2013
Сообщений: 110
#1

Абстрактный класс - C++

15.07.2013, 21:24. Просмотров 1011. Ответов 13
Метки нет (Все метки)

Ребят такая проблема, точнее недопонимания.
Реализую графический редактор.
Есть базовый абстрактный класс GraphObject
От него наследуется класс Point с параметрами X Y
Создаю класс Layer в котором храниться массив GraphObject
C++
1
2
3
4
5
6
7
class GraphicObject //Графический объект
    {
    public:
        GraphicObject();
        virtual ~GraphicObject();
        virtual void Print()=0;
    };
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    class Point : public GraphicObject //Точка
    {
    private:
        short X; //X точки
        short Y; //Y точки
    public:
        Point(short _X, short _Y); //Конструктор
        virtual ~Point(); //Деструктор   
        void SetLocation(short _X, short _Y); //Задать координаты точки
        short GetX(); //Получить X точки
        short GetY(); //Получить Y точки
        void Print(); //Распечатать в консоли
    };
Как то надо иметь возможнотсь не только делать так
C++
1
2
GraphicObject *obj=new Point(10,20);
obj->Print();
но и иметь возможность доступа к методам Point, знаю это вроде противоречит идее абстрактного класса, но как то должно такое реализовываться?
C++
1
2
3
obj->SetLocation(_X,_Y);
short _X=obj->GetX();
short _Y=obj->GetY();
помогите плиз!
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.07.2013, 21:24
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Абстрактный класс (C++):

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

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

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

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

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

Создать класс - данные - абстрактный базовый класс. Создать производные классы - C++
Всем привет! У меня вот такая проблема.... Создать класс - данные - абстрактный базовый класс. Создать производные классы - данные типа...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
15.07.2013, 21:33 #2
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
#include <iostream>
 
using namespace std;
 
class GraphicObject {
protected:
    int m_x, m_y;
public:
    virtual void SetLocation( int, int ) = 0;
    virtual int GetX() const = 0;
    virtual int GetY() const = 0;
};
 
class Point : public GraphicObject {
public:
    Point( int x, int y ) {
        m_x = x;
        m_y = y;
    }
 
    void SetLocation( int x, int y ) {
        m_x = x;
        m_y = y;
    }
 
    int GetX() const { return m_x; }
    int GetY() const { return m_y; }
};
 
int main()
{
    GraphicObject * obj = new Point( 10, 20 );
 
    obj->SetLocation( 20, 30 );
 
    int x = obj->GetX();
    int y = obj->GetY();
 
    return 0;
}
0
arhistratig13
25 / 18 / 2
Регистрация: 18.06.2013
Сообщений: 110
15.07.2013, 21:36  [ТС] #3
Как бы ответ очевиден, задать эти гетеры и сетеры в абстрактном классе, но если добавить дочерний класс линий будем иметь проблему, нужно будет и его прописывать методы... а там еще и квадрат, круг и т.п. как то не гибко получается... и можем по сути только задать или перезадать новым объектом, не думаю что это хорошо на каждое изменение переинициализировать объект, вот такие вот пироги...
P.S. Пока дописывал это, как раз пришел ответ такой.
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
15.07.2013, 21:37 #4
Даже наверное лучше так:
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
#include <iostream>
 
using namespace std;
 
class GraphicObject {
protected:
    int m_x, m_y;
 
public:
    GraphicObject( int x, int y ) : m_x(x), m_y(y) {}
    virtual void SetLocation( int, int ) = 0;
    virtual int GetX() const = 0;
    virtual int GetY() const = 0;
};
 
class Point : public GraphicObject {
public:
    Point( int x, int y ) : GraphicObject( x, y ) {}
 
    void SetLocation( int x, int y ) {
        m_x = x;
        m_y = y;
    }
 
    int GetX() const { return m_x; }
    int GetY() const { return m_y; }
};
 
int main()
{
    GraphicObject * obj = new Point( 10, 20 );
 
    obj->SetLocation( 20, 30 );
 
    int x = obj->GetX();
    int y = obj->GetY();
 
    return 0;
}
0
arhistratig13
25 / 18 / 2
Регистрация: 18.06.2013
Сообщений: 110
15.07.2013, 21:40  [ТС] #5
lazybiz, это конечно делает все это. Но изначально идея в абстрагировании и выделение базового класса Объект, от которого наследуется классы Точка Линия Квадрат Круг, для того чтобы независимо от типа объекта можно было их собрать в массив объектов *Объект, и там уже работать с ними...
0
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
15.07.2013, 21:46 #6
можно вот так сделать
C++
1
2
3
4
5
    GraphicObject *obj = new Point(10, 20);
 
    obj->Print();
    ((Point*)(obj))->SetLocation(5, 5);
    obj->Print();
вроде правильно работает
0
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
15.07.2013, 21:49 #7
Цитата Сообщение от arhistratig13 Посмотреть сообщение
Но изначально идея в абстрагировании и выделение базового класса Объект, от которого наследуется классы Точка Линия Квадрат Круг, для того чтобы независимо от типа объекта можно было их собрать в массив объектов *Объект, и там уже работать с ними...
Какие операции для этих классов различны? Сделайте их виртуальными, остальные - в базовый класс.
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
15.07.2013, 21:51 #8
Если ты не об этом, тогда я вообще не знаю о чем ты...
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
#include <iostream>
 
using namespace std;
 
class GraphicObject {
protected:
    int m_x, m_y;
 
public:
    GraphicObject( int x, int y ) : m_x(x), m_y(y) {}
 
    void SetLocation( int x, int y ) {
        m_x = x;
        m_y = y;
    }
 
    int GetX() const { return m_x; }
    int GetY() const { return m_y; }
 
    virtual int GetRadius() { return 0; };
};
 
class Point : public GraphicObject {
public:
    Point( int x, int y ) : GraphicObject( x, y ) {}
};
 
class Circle : public GraphicObject {
    int m_radius;
 
public:
    Circle( int x, int y, int radius ) : GraphicObject( x, y ), m_radius(radius) {}
 
    virtual int GetRadius() { return m_radius; }
};
 
int main()
{
    GraphicObject * obj1 = new Point( 10, 20 );
    GraphicObject * obj2 = new Circle( 50, 50, 100 );
 
    obj1->SetLocation( 20, 30 );
 
    int x = obj1->GetX();
    int y = obj1->GetY();
 
    cout << obj2->GetRadius() << endl;
 
    return 0;
}
0
arhistratig13
25 / 18 / 2
Регистрация: 18.06.2013
Сообщений: 110
15.07.2013, 22:13  [ТС] #9
Цитата Сообщение от gray_fox Посмотреть сообщение
Какие операции для этих классов различны? Сделайте их виртуальными, остальные - в базовый класс.
Операции Set и Get к разным полям различны, (Точка имеет одну координату X Y) (Линия X1 Y1 X2 Y2)
Вот и получается, чтобы в программе мне нужно их изменять для этого нужен доступ к ним доступ, да и разные методы...

Хотелось выделить библиотеку GraphLib
И с помощью форм отрисовать на PictureBox все это, потом иметь возможность изменять эти объекты, ну типа перемещать, растягивать... чтобы все это организовать нужно реализовать все эти методы растяжения и перетаскивание, хотелось их не засовывать в библиотеку, так как получалась библиотека не гибкая, работающая только с winforms. Была идея выделить сами структуры и не смешивать с реализацией...

Теперь вопрос такой могу ли я создать новую библиотеку ActionsWindows дабы там прописать методы Show Drag
Stretch и т.п. Как бы библиотеку дополнения к первой, чтобы реализовывать все это конкретно на wimform, как то так, надеюсь понятно написал!

То есть реализовать в ней классы с методами изначально забитыми в GraphLib как обстрактные

Добавлено через 7 минут
В общем ладно, забил на правильность и красоту архитектуры, пишу все в одной библиотеке использую PictureBox входным параметров реализации функций спасибо, кто пытался помочь!!!
0
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
15.07.2013, 22:21 #10
Цитата Сообщение от arhistratig13 Посмотреть сообщение
(Точка имеет одну координату X Y) (Линия X1 Y1 X2 Y2)
ИМХО логичнее, если у всех фигур будет одна позиция
1
arhistratig13
25 / 18 / 2
Регистрация: 18.06.2013
Сообщений: 110
16.07.2013, 02:17  [ТС] #11
gray_fox, Да, додумался сделать класс, где просто будут точки хрянящиеся в массиве соединяться... 2 класса на замкнутые и не замкнутые фигуры. Замкнутые массив с заданным числом точек. А не замкнутые список точками, как то так решил, хотя не окончательно еще)) с моим то талантом архитектора...
0
SatanaXIII
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,529
Завершенные тесты: 1
16.07.2013, 15:12 #12
Цитата Сообщение от lazybiz Посмотреть сообщение
Если ты не об этом, тогда я вообще не знаю о чем ты...
У меня такое ощущение, что arhistratig13 хотел наоборот избавиться от вот этого:
C++
1
2
protected:
    int m_x, m_y;
То есть создать класс GraphicObject, в который напихать общих методов для всех фигур (какое-нибудь там удаление, изменение цвета и т.д.), а уже наследниками расширять его под конкретные нужды. У Point был бы:
C++
1
2
private:
    int m_x, m_y;
у какого-нибудь Rectangle:
C++
1
2
private:
    int m_x1, m_y1, m_x2, m_y2;
у какого-нибудь Polygon:
C++
1
vector<int> m_x, m_y;
Цитата Сообщение от gray_fox Посмотреть сообщение
ИМХО логичнее, если у всех фигур будет одна позиция
Это как?
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
16.07.2013, 16:36 #13
SatanaXIII, согласен с тобой. Только у ТС есть еще одна проблема помимо этой.. он не может толком объяснить свою проблему. Поэтому гадать я не намерен.
0
arhistratig13
25 / 18 / 2
Регистрация: 18.06.2013
Сообщений: 110
16.07.2013, 22:26  [ТС] #14
SatanaXIII, Сатана прав
Гадать здесь и не надо, насколько я знаю, абстрактный класс вроде только для этого и существует, чтобы выделить общую сущность, а всю различающуюся реализацию спрятать у наследников...

Попробую пояснить проблему, она в том чтобы сделать чистую библиотеку, чистую от кода привязанного к ОС, к примеру я реализую интерфейс на Windows Forms, хотелось сделать отдельную библиотеку с функциями на входе которых PictureBox, дорабатывающую функционал чистой библиотеки... как то так, прошу прощения что криво объясняю...
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.07.2013, 22:26
Привет! Вот еще темы с ответами:

Абстрактный класс - C++
#include &lt;iostream.h&gt; #include &lt;conio.h&gt; #include &lt;math.h&gt; #include &lt;windows.h&gt; char bufRus; char* Rus(const char* text) { ...

абстрактный класс - C++
не компилирует abcd.cpp //abcd.h #include &lt;cstring&gt; #ifndef _ABCD_H_ #define _ABCD_H_ class ABCd { private: ...

Абстрактный класс - C++
Друзья, подскажите пожалуйста. Как, вот в этом примере с виртуальной функцией, реализовать уже как абстрактный базовый класс, т.е. с чисто...

абстрактный класс - C++
стоит ли в абстрактном классе объявлять поля данных? или лучше объявлять только виртуальные функции? с точки зрения правильности как лучше?


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
16.07.2013, 22:26
Ответ Создать тему
Опции темы

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