Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Объекты разных классов в динамическом списке, Объединение объектов разных классов 
:(
    Опции темы
pifpafx
  Дата 26.10.2011, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 7.7.2011

Репутация: нет
Всего: нет



Приветствую товарищи! Возникла проблема: никак не могу додуматься как реализовать хранение объектов разных классов в одном списке, с возможностью добавления, удаления и просмотра информации об объекте по номеру в списке... Думаю может как нибудь прикрутить STL? Во только разве тама возможно создание векторных списков для объектов разных классов...

Код

#include <iostream> // подключаем стандартную библиотеку организации ввода-вывода
using namespace std; // используем стандартное пространство имён
// Абстрактный класс Фигура
class Figure
{
    // защищенные данные класса
protected:
    double Volume,Height; // переменные для хранения значений объёма и высоты фигуры
    //char name[10]; // переменная для хранения названия фигуры
    // общедоступные функции класса
public:
    void showdata() const
    {
        cout << "Volume = " << Volume << " Height = " << Height << endl;
    }
    void getdata()
    {
        cout << "Enter Height ";
        cin >> Height;
    }
    // конструктор базового класса 
  Figure() : Volume(0), Height(0) // инициализируем при создании объекта с помощью конструктора
  {   /*пустое тело*/  };          // значения высоты и объёма "по умолчанию" равными 0    
};

// Производный класс - Пирамида
class Pyramid : public Figure
{
private:
    float area; // переменная для хранения значения площади основания пирамиды

public:
    Pyramid() : Figure (),  area(0)  // инициализируем при создании объекта значений объёма и высоты
    {    /*пустое тело*/ }             // с помощью конструктора абстрактного класса , а также 
                                     // площади основания пирамиды "по умолчанию"
    void getdata ()
    {
        Figure::getdata();
        cout << "Enter Area ";
        cin >> area;
        Volume = (Height * area)/3;
    }
};

// Производный класс - Куб
class Cube : public Figure
{
public:
    Cube() : Figure()    // инициализация объекта класса Куб
    { /*пустое тело*/ }

    void getdata ()
    {
        Figure::getdata();
        Volume = pow(Height,3);
    }
};

// Производный класс - Прямоугольный параллелепипед
class Parall : public Figure
{
private:
    int b,c;  // описание переменных для хранения длины и ширины параллелепипеда

public:
    Parall() : Figure()    // инициализация объекта класса Прямоугольный параллелепипед
    { /*пустое тело*/ }

    void getdata ()
    {
        Figure::getdata();
        cout << "Enter Length ";
        cin >> b;
        cout << "Enter Width ";
        cin >> c;
        Volume = (Height * b * c);
    }
};

// Производный класс - Цилиндр
class Cylinder : public Figure
{
private:
    float radius;  // описание переменной для хранения радиуса основания цилиндра

public:
    Cylinder() : Figure()    // инициализация объекта класса Цилиндр
    { /*пустое тело*/ }
    void getdata ()
    {
        Figure::getdata();
        cout << "Enter Radius ";
        cin >> radius;
        Volume = 3.141592 * pow(radius,2) * Height;
    }
};
// --------------------------------- ФУНКЦИЯ MAIN --------------------------------------
int main()
{
    int choice;
    char choice2;
    Pyramid P;
    Cube cube1;
    Parall Pl;
    Cylinder Cy;
    cout << "What would you like to do?\n";
    do 
    {
        cout << "(1) Create a new Figure "        
             << "\n(2) View information about the figure "        
             << "\n(3) Delete the figure "
             << "\n(4) See list of all figures \n";
        cin >> choice;
        switch(choice)
        {
            case 1: cout << "What shape would you like to create?";
                    cout << "\nPyramid(1), Cube(2), Parallelepiped(3), Cylinder(4)\n";
                    cin >> choice;
                    switch(choice)
                    {
                    case 1: P.getdata(); P.showdata(); break;
                    case 2: cube1.getdata(); cube1.showdata(); break;
                    case 3: Pl.getdata(); Pl.showdata(); break;
                    case 4: Cy.getdata(); Cy.showdata(); break;
                    }
                    break;
            case 2:  break;
            case 3:  break;
            case 4:  break;
        }
        
        cout << "Do you want to do something else? (y/n)";
        cin >> choice2;
    }
    while (choice2 == 'y' || choice2 == 'Y');
    return 0;
}
 
PM MAIL   Вверх
newbee
Дата 26.10.2011, 14:14 (ссылка) |  (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 4
Всего: 19



Наслаждайся статической типизацией. Впрочем никто не мешает прикрутить кривую динамическую, используя variant... Будет у тебя list<variant>. Реализаций вариантов много, гугли или сам напиши.


--------------------
You're face to face
With man who sold the world
PM   Вверх
azesmcar
Дата 26.10.2011, 14:57 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(pifpafx @  26.10.2011,  14:12 Найти цитируемый пост)
никак не могу додуматься как реализовать хранение объектов разных классов в одном списке, с возможностью добавления, удаления и просмотра информации об объекте по номеру в списке

хранить указатель на базовый класс, а информацию об объекте получать с помощью виртуальных функций.
PM   Вверх
pifpafx
Дата 26.10.2011, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 7.7.2011

Репутация: нет
Всего: нет



Цитата(azesmcar @ 26.10.2011,  14:57)
хранить указатель на базовый класс, а информацию об объекте получать с помощью виртуальных функций.

То есть с помощью виртуальных функций можно свободно пользоваться STL контейнерами?
PM MAIL   Вверх
azesmcar
Дата 26.10.2011, 15:13 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(pifpafx @  26.10.2011,  15:06 Найти цитируемый пост)
То есть с помощью виртуальных функций можно свободно пользоваться STL контейнерами? 

С помощью виртуальных функций можно работать с наследником через указатель на базовый класс, с STL контейнерами это никак не связано.
PM   Вверх
pifpafx
Дата 26.10.2011, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 7.7.2011

Репутация: нет
Всего: нет



Цитата(azesmcar @ 26.10.2011,  15:13)
С помощью виртуальных функций можно работать с наследником через указатель на базовый класс, с STL контейнерами это никак не связано.

А для полного счастья можно небольшой примерчик? smile 
PM MAIL   Вверх
azesmcar
Дата 26.10.2011, 15:27 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Код

#include <iostream>
#include <vector>
#include <string>

class i_fig
{
public:
    virtual std::string name() const = 0;
};

class circle : public i_fig
{
public:
    virtual std::string name() const
    {
        return "circle";
    }
};

class rectangle: public i_fig
{
public:
    virtual std::string name() const
    {
        return "rectangle";
    }
};

int main()
{
    std::vector<i_fig*> objects;

    objects.push_back(new circle());
    objects.push_back(new rectangle());
    objects.push_back(new circle());

    std::cout << objects[1]->name() << std::endl;

    for (std::vector<i_fig*>::const_iterator it = objects.begin(); it != objects.end(); ++it)
        delete *it;
}

PM   Вверх
pifpafx
Дата 26.10.2011, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 7.7.2011

Репутация: нет
Всего: нет



azesmcar премного благодарен  smile  smile 
PM MAIL   Вверх
bems
Дата 26.10.2011, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: нет
Всего: 88



Цитата(newbee @  26.10.2011,  14:14 Найти цитируемый пост)
Наслаждайся статической типизацией
Общий предок для всех классов сильно бы помог делу, и без динамической типизации


--------------------
Обижено школьников: 8
PM MAIL   Вверх
newbee
Дата 26.10.2011, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 4
Всего: 19



Цитата(bems @  26.10.2011,  21:04 Найти цитируемый пост)
Общий предок для всех классов сильно бы помог делу, и без динамической типизации 
Я поленилась код читать, а по описанию подходил вариант. Я уже давно признала ошибку и поставила азесмкару плюсик за внимательность ))


--------------------
You're face to face
With man who sold the world
PM   Вверх
kamre
Дата 31.10.2011, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 330
Регистрация: 24.3.2006

Репутация: 1
Всего: 13



Цитата(bems @ 26.10.2011,  20:04)
Цитата(newbee @  26.10.2011,  14:14 Найти цитируемый пост)
Наслаждайся статической типизацией
Общий предок для всех классов сильно бы помог делу, и без динамической типизации

Это если потомки не расширяют интерфейс, а только реализуют/изменяют интерфейс базового класса.
PM MAIL   Вверх
bems
Дата 1.11.2011, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: нет
Всего: 88



Цитата(kamre @  31.10.2011,  23:53 Найти цитируемый пост)
то если потомки не расширяют интерфейс, а только реализуют/изменяют интерфейс базового класса. 
в противном случае 
хранить интерфейсы, и делать QueryInterface. 

Ах да, когда пишут на плюсах считают что интерфейсы это обязательно com, а значит обязательно винда... Неповезло, да


--------------------
Обижено школьников: 8
PM MAIL   Вверх
boostcoder
Дата 1.11.2011, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(bems @  1.11.2011,  15:18 Найти цитируемый пост)
когда пишут на плюсах считают что интерфейсы это обязательно com

что такое интерфейсы - знаю. но что такое com - нет. так что утверждение необоснованно.
PM WWW   Вверх
bems
Дата 1.11.2011, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: нет
Всего: 88



Цитата(boostcoder @  1.11.2011,  15:22 Найти цитируемый пост)
утверждение необоснованно

надеюсь


Цитата(boostcoder @  1.11.2011,  15:22 Найти цитируемый пост)
что такое com

создаётся впечатление что ты этим гордишься smile


--------------------
Обижено школьников: 8
PM MAIL   Вверх
boostcoder
Дата 1.11.2011, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(bems @  1.11.2011,  15:28 Найти цитируемый пост)
создаётся впечатление что ты этим гордишься

чем тут гордится? не эрудированностью?
PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0949 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.