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

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

Восстановить пароль Регистрация
 
arhistratig13
25 / 18 / 2
Регистрация: 18.06.2013
Сообщений: 110
15.07.2013, 21:24     Абстрактный класс #1
Ребят такая проблема, точнее недопонимания.
Реализую графический редактор.
Есть базовый абстрактный класс 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();
помогите плиз!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.07.2013, 21:24     Абстрактный класс
Посмотрите здесь:

C++ абстрактный класс
Абстрактный класс C++
абстрактный класс C++
Абстрактный класс C++
C++ Абстрактный класс
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4842 / 2981 / 367
Регистрация: 10.11.2010
Сообщений: 11,013
Записей в блоге: 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;
}
arhistratig13
25 / 18 / 2
Регистрация: 18.06.2013
Сообщений: 110
15.07.2013, 21:36  [ТС]     Абстрактный класс #3
Как бы ответ очевиден, задать эти гетеры и сетеры в абстрактном классе, но если добавить дочерний класс линий будем иметь проблему, нужно будет и его прописывать методы... а там еще и квадрат, круг и т.п. как то не гибко получается... и можем по сути только задать или перезадать новым объектом, не думаю что это хорошо на каждое изменение переинициализировать объект, вот такие вот пироги...
P.S. Пока дописывал это, как раз пришел ответ такой.
castaway
Эксперт С++
4842 / 2981 / 367
Регистрация: 10.11.2010
Сообщений: 11,013
Записей в блоге: 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;
}
arhistratig13
25 / 18 / 2
Регистрация: 18.06.2013
Сообщений: 110
15.07.2013, 21:40  [ТС]     Абстрактный класс #5
lazybiz, это конечно делает все это. Но изначально идея в абстрагировании и выделение базового класса Объект, от которого наследуется классы Точка Линия Квадрат Круг, для того чтобы независимо от типа объекта можно было их собрать в массив объектов *Объект, и там уже работать с ними...
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();
вроде правильно работает
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
15.07.2013, 21:49     Абстрактный класс #7
Цитата Сообщение от arhistratig13 Посмотреть сообщение
Но изначально идея в абстрагировании и выделение базового класса Объект, от которого наследуется классы Точка Линия Квадрат Круг, для того чтобы независимо от типа объекта можно было их собрать в массив объектов *Объект, и там уже работать с ними...
Какие операции для этих классов различны? Сделайте их виртуальными, остальные - в базовый класс.
castaway
Эксперт С++
4842 / 2981 / 367
Регистрация: 10.11.2010
Сообщений: 11,013
Записей в блоге: 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;
}
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 входным параметров реализации функций спасибо, кто пытался помочь!!!
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
15.07.2013, 22:21     Абстрактный класс #10
Цитата Сообщение от arhistratig13 Посмотреть сообщение
(Точка имеет одну координату X Y) (Линия X1 Y1 X2 Y2)
ИМХО логичнее, если у всех фигур будет одна позиция
arhistratig13
25 / 18 / 2
Регистрация: 18.06.2013
Сообщений: 110
16.07.2013, 02:17  [ТС]     Абстрактный класс #11
gray_fox, Да, додумался сделать класс, где просто будут точки хрянящиеся в массиве соединяться... 2 класса на замкнутые и не замкнутые фигуры. Замкнутые массив с заданным числом точек. А не замкнутые список точками, как то так решил, хотя не окончательно еще)) с моим то талантом архитектора...
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5548 / 2562 / 233
Регистрация: 01.11.2011
Сообщений: 6,332
Завершенные тесты: 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 Посмотреть сообщение
ИМХО логичнее, если у всех фигур будет одна позиция
Это как?
castaway
Эксперт С++
4842 / 2981 / 367
Регистрация: 10.11.2010
Сообщений: 11,013
Записей в блоге: 10
Завершенные тесты: 1
16.07.2013, 16:36     Абстрактный класс #13
SatanaXIII, согласен с тобой. Только у ТС есть еще одна проблема помимо этой.. он не может толком объяснить свою проблему. Поэтому гадать я не намерен.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.07.2013, 22:26     Абстрактный класс
Еще ссылки по теме:

C++ Абстрактный класс
Абстрактный класс C++
Абстрактный класс/Класс интерфейс C++

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

Или воспользуйтесь поиском по форуму:
arhistratig13
25 / 18 / 2
Регистрация: 18.06.2013
Сообщений: 110
16.07.2013, 22:26  [ТС]     Абстрактный класс #14
SatanaXIII, Сатана прав
Гадать здесь и не надо, насколько я знаю, абстрактный класс вроде только для этого и существует, чтобы выделить общую сущность, а всю различающуюся реализацию спрятать у наследников...

Попробую пояснить проблему, она в том чтобы сделать чистую библиотеку, чистую от кода привязанного к ОС, к примеру я реализую интерфейс на Windows Forms, хотелось сделать отдельную библиотеку с функциями на входе которых PictureBox, дорабатывающую функционал чистой библиотеки... как то так, прошу прощения что криво объясняю...
Yandex
Объявления
16.07.2013, 22:26     Абстрактный класс
Ответ Создать тему
Опции темы

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