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

Полиморфизм и шаблонный контейнер. - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
Андрей2011
29 / 23 / 2
Регистрация: 18.01.2011
Сообщений: 359
20.12.2011, 10:57     Полиморфизм и шаблонный контейнер. #1
Как вы знаете, template определяет класс или несколько классов, к которым приводятся ф-и или др. класы использующие template.
Обычно template используют для создания стеков или массивов объектов.
Вопрос вот в чем. Есть у меня объект. и у него несколько наследников. как я могу, указав базовый класс, содержать в стеке с помощью template эти объекты наследники? Дело в том, что обычно наследники "урезаются" до параметров базового класса в template. Можно ли это обойти и как?
За ранее спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.12.2011, 10:57     Полиморфизм и шаблонный контейнер.
Посмотрите здесь:

C++ Шаблонный класс
C++ Создать шаблонный класс-контейнер Array, который представляет собой массив
C++ Шаблонный стек
C++ Шаблонный ввод
C++ Шаблонный класс
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
20.12.2011, 11:00     Полиморфизм и шаблонный контейнер. #2
Вы о полиморфизме слышали?
Андрей2011
29 / 23 / 2
Регистрация: 18.01.2011
Сообщений: 359
20.12.2011, 11:19  [ТС]     Полиморфизм и шаблонный контейнер. #3
слышали. У меня в классах есть ф-я
C++
1
virtual void Print()
которая
должна перегружаться в каждой мм...в каждом объекте наследнике.
Примерно подобным образом должна работать на мой взгляд программа:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Point Po(1,1);  //просто точка имеет 2 координаты
Pixel Pi(2,3);   //писксел кромее коорд. еще и ставит черный цвет по умолчанию.
Pixel Pi2(12,9,Pixel::Color::red);
 
 
Stack<Point> StackPixel;   //Stack типа template
 
StackPixel.AddObject(Po); //AddObject - добавляет объект в стек.
StackPixel.AddObject(Pi);
StackPixel.AddObject(Pi2);
 
 
for (int i=0; i<StackPixel.KolObject; i++)
{
    StackPixel.MyObject[i].Print(); //выводит в консоль коорд. и цвет.
}
т.е. у поинта выводит только координаты
а у писксела должен выводить еще и цвет.
но фишка в том, что когда я помещаю объект в template то все у меня
превращается однозначтно в Point а значит цвет отбрасывается.
Как мне хранить разные объекты потомки????
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
20.12.2011, 11:34     Полиморфизм и шаблонный контейнер. #4
Андрей2011, Указатели хранить как бэ.
Или сцылки
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
20.12.2011, 11:36     Полиморфизм и шаблонный контейнер. #5
Надо хранить указатель на базовый класс, а Вы храните не указатель, а экземпляр.
Андрей2011
29 / 23 / 2
Регистрация: 18.01.2011
Сообщений: 359
20.12.2011, 12:01  [ТС]     Полиморфизм и шаблонный контейнер. #6
Цитата Сообщение от fasked Посмотреть сообщение
Надо хранить указатель на базовый класс, а Вы храните не указатель, а экземпляр.
- ну где хранить? Я храню и то и то. вот например:
C++
1
2
3
4
5
6
7
8
template<class TObject>
Stack<TObject>::Stack()
{ 
    Max=Max_;
    KolObject=0;
    s4=0;
    MyObject = GetMassivObject();
}
- тут MyObject - это объект типа Point. как тут указатели или ссыки делать не знаю.
а вот ф-я добавления объекта:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
template<class TObject>
void Stack<TObject>::AddObject(TObject &Object) 
{ 
 
    //сначала нужно занять память.
    if (KolObject>=Max) 
    {   
        Max = Max << 1;                 //увеличим в 2 раза память 
        MyObject = GetMassivObject();   //Создадим массив.
    }
        //далее добавляем объект в массив объектов.
    *MyObject = Object;
    MyObject[KolObject] = Object; //тут вот объект в массив добавляется!!
    KolObject++;
};
тут я ссылку получаю на объект в том числе и типа Pixel
В чем принципиальная ошибка?

а вот сам класс:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
template<class TObject>
class Stack
{
public:
    Stack();
//  void AddObject(TObject &Object); 
    void AddObject(TObject &Object); 
    void Clear();
    int KolObject;
    TObject *MyObject,*GetMassivObject();
 
    ~Stack(); 
private:
    TObject *MyObject2,*MyObject3;
    int Max,s4;
};
- Объекты я храню вв иде указателей...
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
20.12.2011, 12:43     Полиморфизм и шаблонный контейнер. #7
А это что такое? Следи за мыслью:
C++
1
MyObject = GetMassivObject();   //Создадим массив.
То есть я так понял, MyObject указывает на массив нужного размера элементов типа MyObject;

Дальше:
C++
1
2
       *MyObject = Object;
        MyObject[KolObject] = Object; //тут вот объект в массив добавляется!!
В этот массив ты кладёшь объект Object 2 раза: по нулевому смещению
(относительно начала массива) и по смещению KolObject (тоже относительно начала массива)
То есть по окончании этих инструкций у тебя в массиве MyObject лежат 2 объекта Object;
оно так задумано или это ошибка?
Андрей2011
29 / 23 / 2
Регистрация: 18.01.2011
Сообщений: 359
20.12.2011, 12:59  [ТС]     Полиморфизм и шаблонный контейнер. #8
Да путано получилось. Написал мини прогу в которой отражается моя проблема. Надеюсь на ваше терпение, уважаемые коллеги. Итак:
h файл:
//т.е. создается класс
C++
1
2
3
4
5
6
7
8
9
10
11
12
//**********************************
template<class TObject>
class NewStack
{
public:
    NewStack(TObject &MyObject) :MyObject_(MyObject) {};
    int KolObject;
    TObject MyObject_;
 
    ~NewStack() {}; 
};
//**********************************
сpp. файл (главный. типа main)

C++
1
2
3
4
5
6
7
Point Po(1,1);
Pixel Pi(12,9,Pixel::Color::red);
 
NewStack<Point> NewStackPixel(Po);
NewStackPixel.MyObject_.Print();
NewStack<Point> NewStackPixel(Pi);
NewStackPixel.MyObject_.Print(); //вот тут он отрабатывает как поинт. а я хочу чтоб как пиксел
Добавлено через 2 минуты
ну и добавлю для полного понимания что выводит.
C++
1
2
3
4
void Point::Print()const
{
    cout << '(' << x_ << ',' << y_ << ')';
}
и
C++
1
2
3
4
5
void Pixel::Print()const
{
    Point::Print();
    cout << "Pixel: " << c_ << endl;
}
Добавлено через 1 минуту
в классе Point (класс родитель) объявлена как:
C++
1
virtual void Print()const;
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
20.12.2011, 13:17     Полиморфизм и шаблонный контейнер. #9
C++
1
2
NewStack<Point> NewStackPixel(Pi);
NewStackPixel.MyObject_.Print(); //вот тут он отрабатывает как поинт. а я хочу чтоб как пиксел
Я не уверен, но обратил бы внимание на это: Pi ты кладёшь не как Pixel, а именно как
Point, не ошибка?
NewStack<Point> NewStackPixel(Pi);
Андрей2011
29 / 23 / 2
Регистрация: 18.01.2011
Сообщений: 359
20.12.2011, 13:20  [ТС]     Полиморфизм и шаблонный контейнер. #10
ну Point - родитель. pixel - наследник. я вот и хочу добиться того чтоб под родительским классом можно было хранить ссылки или указатели на наследников. Но чтоб был пиксел! ато у меня все превращается в поинт. Такая штука.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
20.12.2011, 13:23     Полиморфизм и шаблонный контейнер. #11
А так если написать?
C++
1
NewStack<Pixel> NewStackPixel(Pi);
В противном случае вроде как при передаче в функцию ты ЯВНО урезаешь
наследника до родителя
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
20.12.2011, 13:28     Полиморфизм и шаблонный контейнер. #12
Андрей2011, Пример тебе.
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
#include <iostream>
#include <vector>
 
class Object
{
public:
   virtual ~Object()
   {
   }
   virtual void print()
   {
      std::cout << "In base print" << std::endl;
   }
};
 
class Int_Object : public Object
{
public:
   Int_Object(int val):value(val)
   {
   }
   virtual void print()
   {
      std::cout << "In int print: " << value << std::endl;
   }
private:
   int value;
};
 
typedef std::vector<Object*> objects;
 
int main()
{
   objects objs;
   objs.push_back(new Int_Object(5));
   objs.push_back(new Object());
   for (objects::iterator iter = objs.begin(); iter != objs.end(); ++iter)
   {
      (*iter)->print();
   }
   for (objects::iterator iter = objs.begin(); iter != objs.end(); ++iter)
   {
      delete *iter;
   }
}
Андрей2011
29 / 23 / 2
Регистрация: 18.01.2011
Сообщений: 359
20.12.2011, 14:12  [ТС]     Полиморфизм и шаблонный контейнер. #13
Уважаемый, kravam, если написать NewStack<Pixel> NewStackPixel(Pi); - то все работает как надо, но мне нада чтоб писать NewStack<Point> NewStackPixel(Pi); - иначе бы я тут не сидел.
Уважаемый, ForEveR, решил фактически за меня всю задачу. Несколько необычным способом но тем не менее.
Вобщем всем спасибо. Буду осознавать последний код.
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
20.12.2011, 16:51     Полиморфизм и шаблонный контейнер. #14
Цитата Сообщение от Андрей2011 Посмотреть сообщение
Несколько необычным способом но тем не менее.
Это у Вас был необычный способ добиться полиморфического поведения. Здесь все как раз правильно.
В хронологической последовательности было два раза отмечено:
Цитата Сообщение от ForEveR Посмотреть сообщение
Андрей2011, Указатели хранить как бэ.
Цитата Сообщение от fasked Посмотреть сообщение
Надо хранить указатель на базовый класс, а Вы храните не указатель, а экземпляр.
Казалось бы есть надежда:
Цитата Сообщение от Андрей2011 Посмотреть сообщение
ну Point - родитель. pixel - наследник. я вот и хочу добиться того чтоб под родительским классом можно было хранить ссылки или указатели.
А вот что надо использовать указатель:
Цитата Сообщение от ForEveR Посмотреть сообщение
typedef std::vector<Object*> objects;
Вы так и не осознали.
Андрей2011
29 / 23 / 2
Регистрация: 18.01.2011
Сообщений: 359
21.12.2011, 10:29  [ТС]     Полиморфизм и шаблонный контейнер. #15
Ну тут товарищ вектор использовал ибо! а по другому фиг знает как оно работает. Щас буду разбираться. Если посетит прозрение - выложу достойный вариант решения.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.12.2011, 10:30     Полиморфизм и шаблонный контейнер.
Еще ссылки по теме:

Ассоциативный контейнер и шаблонный класс C++
C++ шаблонный класс
C++ Полиморфизм, класс-контейнер

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

Или воспользуйтесь поиском по форуму:
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
21.12.2011, 10:30     Полиморфизм и шаблонный контейнер. #16
Цитата Сообщение от Андрей2011 Посмотреть сообщение
Ну тут товарищ вектор использовал ибо! а по другому фиг знает как оно работает
А какая разница-то?
Yandex
Объявления
21.12.2011, 10:30     Полиморфизм и шаблонный контейнер.
Ответ Создать тему
Опции темы

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