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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> List обьектов разных типов, как сохранять в список обьекты разных т 
V
    Опции темы
vamp0x00
Дата 7.10.2010, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Допустим у меня есть такая простая иерархия 
Код

class Person
{
};

class Student: public Person {
};

class Lecturer: public Person {
};


можно ли как то создать STLный list с объектами  этих классов  ???
 
Код

 lst.push_back(Person(name, gender, age));
  lst.push_back(Student(name, gender, age, group, course));


если нет то как еще можно хранить разные объекты в одном списке?
PM MAIL ICQ GTalk   Вверх
azesmcar
Дата 7.10.2010, 14:45 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(vamp0x00 @  7.10.2010,  14:35 Найти цитируемый пост)
можно ли как то создать STLный list с объектами  этих классов  ???

Да, храни указатель на базовый класс. А еще лучше умный указатель.
Код

std::list< boost::shared_ptr<Person> > lst;
lst.push_back(boost::make_shared<Student>());
lst.push_back(boost::make_shared<Lecturer>());


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


Новичок



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

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



первый раз вижу boost smile где я напартачил?
а и как поступать с выводом списка в таком случае?(

Код

#include <iostream>
#include <list>
#include <cstring>
#include <boost/smart_ptr.hpp>

using namespace std;
using namespace boost;


class Person
{
  public:
    string name;
    int gender, age;
    Person(){};
    Person(string name0, int gender0, int age0) {
      name = name0;
      gender=gender0;
      age=age0;
    };
    void show(void) {
      cout << "Name: " << name << endl;
      cout << "Gender: " << gender << endl;
      cout << "Age: " << age << endl;
    };
};

class Student: public Person {
  public:
    string group;
    int course;
    Student(){};
    Student(string name0, int gender0, int age0, string group0, int course0) :
      Person(name0, gender0, age0) {
      group = group0;
      course=course0;
    };
    void show(void) {
      Person::show();
      cout << "Group: " << group << endl;
      cout << "Course: " << course << endl;
    };
};

class Lecturer: public Person {
  public:
    string subj;
    int degree;
    Lecturer(){};
    Lecturer(string name0, int gender0, int age0, string subj0, int degree0) :
      Person(name0, gender0, age0) {
      subj = subj0;
      degree=degree0;
    };
    void show(void) {
      cout << "Subject: " << subj << endl;
      cout << "Degree: " << degree << endl;
    };
};

class Chair: public Lecturer {
  public:
    string cath;
    Chair(){};
    Chair(string name0, int gender0, int age0, string subj0, int degree0, string cath0) :
      Lecturer(name0, gender0, age0, subj0, degree0) {
      cath = cath0;
    };
    void show(void) {
      cout << "Cathedra: " << cath << endl;
    };
};




int main(void)
{
  list<shared_ptr<Person> > lst;
  lst.push_back(make_shared<Person>("name1", "1", "21"));
  lst.push_back(make_shared<Student>("name2", "2", "22", "5", "4"));
  list<Person>::iterator p = lst.begin();
  while(p != lst.end()) {
     p->show();
     p++;
  }
  return 0;
}

PM MAIL ICQ GTalk   Вверх
azesmcar
Дата 7.10.2010, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(vamp0x00 @  7.10.2010,  15:14 Найти цитируемый пост)
где я напартачил?

Цитата(vamp0x00 @  7.10.2010,  15:14 Найти цитируемый пост)
первый раз вижу boost 

вот тут smile 
boost - это не часть C++, но часть boost-а скоро ею станет. В общем если отдельно не качал и не ставил, то его у тебя просто нет.
Если компилятор из последних (gcc 4.5 или VS2010) то он уже частично поддерживает новый стандарт, и умные указатели там есть.
Т.е. можно вот так
Код

#include <memory>
...

и boost::shared_ptr заменить на std::shared_ptr.
Цитата

#include <boost/smart_ptr.hpp>

это кстати в любом случае неверно, должно быть
Код

#include <boost/shared_ptr.hpp>

ну и если нет, то можно хранить простой указатель, но тогда придется удалять вручную.

П.С. Я бы рекомендовал поставить boost.

http://www.boost.org

Это сообщение отредактировал(а) azesmcar - 7.10.2010, 15:25
PM   Вверх
vamp0x00
Дата 7.10.2010, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



я поставил boost и получил ошибки
vamp@0x00:~$ g++-3.3 2.cpp 
2.cpp: In function `int main()':
2.cpp:80: error: no matching function for call to `make_shared(const char[6], 
   const char[2], const char[3])'
2.cpp:81: error: no matching function for call to `make_shared(const char[6], 
   const char[2], const char[3], const char[2], const char[2])'
2.cpp:82: error: conversion from `
   std::_List_iterator<boost::shared_ptr<Person>, boost::shared_ptr<Person>&, 
   boost::shared_ptr<Person>*>' to non-scalar type `std::_List_iterator<Person, 
   Person&, Person*>' requested

PM MAIL ICQ GTalk   Вверх
azesmcar
Дата 7.10.2010, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Код

#include <boost/make_shared.hpp>

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


Новичок



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

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



Код

#include <boost/shared_ptr.hpp>
  есть а вот на 
Код

#include <boost/make_shared.hpp>


пишет 2.cpp:5:33: error: boost/make_shared.hpp: No such file or directory


Код

 list<boost::shared_ptr<Person> > lst;
  lst.push_back(boost::make_shared <Person> ("name1", "1", "21"));
  lst.push_back(boost::make_shared <Student> ("name2", "2", "22", "5", "4"));

 g++ 2.cpp 
2.cpp: In function 'int main()':
2.cpp:76: error: 'make_shared' is not a member of 'boost'
2.cpp:76: error: expected primary-expression before '>' token
2.cpp:77: error: 'make_shared' is not a member of 'boost'
2.cpp:77: error: expected primary-expression before '>' token

PM MAIL ICQ GTalk   Вверх
vamp0x00
Дата 8.10.2010, 01:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



сделал через
Код

   list<Person*> lst;

PM MAIL ICQ GTalk   Вверх
azesmcar
Дата 8.10.2010, 05:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(vamp0x00 @  7.10.2010,  15:54 Найти цитируемый пост)
пишет 2.cpp:5:33: error: boost/make_shared.hpp: No such file or directory

немного странно, что за версия?

Цитата(vamp0x00 @  8.10.2010,  01:57 Найти цитируемый пост)
сделал через

можно и так
Код

lst.push_back(boost::shared_ptr<Person>(new Student()));


Это сообщение отредактировал(а) azesmcar - 8.10.2010, 05:30
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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