Имя: Пароль:
IT
 
C++: ковариантность
,
0 Ненавижу 1С
 
гуру
09.08.11
16:07
Как (или уже есть готовое) обеспечить ковариантность?
class A {}
class B : public A {}
...
vector<B*> vb;
vector<A*> va=vb;
1 Волшебник
 
09.08.11
16:08
легче обеспечить контравариантность
2 Ненавижу 1С
 
гуру
09.08.11
16:09
(1) ?
3 ДенисЧ
 
09.08.11
16:09
Что сделать надо? О_о
4 Ненавижу 1С
 
гуру
09.08.11
16:10
даже не так, я не хотел бы выделять память бы под новую коллекцию, я хочу иметь обертку над vector<B*>, но с интерфейсом vector<A*>
5 Волшебник
 
09.08.11
16:10
(3) Уйди, малыш. Не мешай дядям разговаривать
6 Xapac
 
09.08.11
16:10
ковариантность?
7 Xapac
 
09.08.11
16:11
(4)тада тебе:
vector<B*> *vb = new ....;
vector<A*> *va=vb;
8 ДенисЧ
 
09.08.11
16:11
(5) простите, дяденька...
Я очень любознательный... Объясните на пальчиках... Может, пригодится в жизни... Тётенек умным словом буду удивлять...
9 Ненавижу 1С
 
гуру
09.08.11
16:12
(7) не взлетит
10 Планета Обезьян
 
09.08.11
16:12
(8) "Тётенек умным словом буду удивлять" - это называется коварность
11 Xapac
 
09.08.11
16:15
(9)почему?
12 Steel_Wheel
 
09.08.11
16:15
Интересно, в C# это реализовано на уровне среды разработки
13 Ненавижу 1С
 
гуру
09.08.11
16:16
(11) они несовместимы vector<B*> и vector<A*>
14 Ненавижу 1С
 
гуру
09.08.11
16:16
(12) да
15 Xapac
 
09.08.11
16:21
тада:

class A {}
class B : public A {}
...
vector<B*> vb;
vector<A*> va;
vector<B*>::iterator i = vb.begin();
while(i!=vb.end())
{
 A a = (A*)(i*);//звездочки скобочки уточнить
 va.puch_back(a);
 i++;
}
16 Ненавижу 1С
 
гуру
09.08.11
16:26
(15) смотри (4)
17 Xapac
 
09.08.11
16:37
#include<iostream>
#include<vector>
class A {} ;
class B : public A {} ;
int main()
{
   std::vector<B> *vb = new std::vector<B>;
   std::vector<A> *va = (std::vector<A>*)(vb);
}
18 Xapac
 
09.08.11
16:37
студия переварила
19 Ненавижу 1С
 
гуру
09.08.11
16:39
(17) ну видимо да, придется явное преобразование
20 DmitrO
 
09.08.11
16:51
(17) ну вообще-то это не верно.. (не безопасное преобразование в стиле си)
(0)
ты должен всегда использовать контейнер vector<A*>, но складывать в него ты можешь и указатели на B, за счет наследования они туда лягут как родные. а когда будешь доставать от туда ты должен сделать следующее

vector<A*> v;
v.push_back(new B()); //down cast
B* b = static_cast<B*>(v[0]); //up cast

все преобразования будут контролироваться компилятором в отличии от примера в (17)
21 Ненавижу 1С
 
гуру
09.08.11
16:52
(20) а теперь прочти (4), я не хочу выделять новой памяти
22 DmitrO
 
09.08.11
16:54
я абсолютно не понял эту фразу
23 Xapac
 
09.08.11
16:54
(21)А нафига вам такое нужно? практическое применение найдете? поделитесь? или "чтобы было"?
24 Xapac
 
09.08.11
16:55
(22)Не хочет памяти на 2 вектора  выделять я так понял
25 Jstunner
 
09.08.11
16:55
(20) чего такого компилятор контролирует static_cast'ом в указанном примере?
26 DmitrO
 
09.08.11
16:56
в (17) вообще не правильный код, если класс B будет иметь члены данных - будет вылет в космос.
27 Xapac
 
09.08.11
16:57
(26)Члены данных? вы сможете сделать на базе(17) вылет в космос?
28 DmitrO
 
09.08.11
17:01
(25) static_cast будет проверять действительно ли класс B является наследником класса A и на каком уровне наследуется, если это не так - не скомпилится. Реализация вычисления аргумента push_back будет делать тоже самое.
29 Xapac
 
09.08.11
17:02
(20)Вообще твой пример более правилен в отличае от (17) но автор(0) я так понял хочет помучатся.
30 Жан Пердежон
 
09.08.11
17:03
(10) на 2м курсе по матану рассказывали - не пригодилось
31 DmitrO
 
09.08.11
17:04
пля, я в сишном коде комментарий поставил как в 1Сном - позор мне :)
32 Xapac
 
09.08.11
17:06
(31)Нормальный одно-строчный комментарий не кори себя.
33 Ненавижу 1С
 
гуру
09.08.11
17:09
ну и наконец еще одна фича о которой думаю, обертка над vector<vector<T*>> которая будет вести себя как vector<T*>
34 DmitrO
 
09.08.11
18:07
хм.. таблица что-ли? при некоторой заданной строке он будет вести себя как вектор значений полей строки, а при некотором заданном столбце он будет вести себя как вектор значений столбца?
35 DmitrO
 
09.08.11
18:14
тогда уж лучше так vector<vector<T*>*>
36 Ненавижу 1С
 
гуру
07.09.11
15:16
чего хочу?
вот примерно такого (это пример на C#), но видимо мне еще долго читать и курить философию С++ придется

   class A
   {
   }

   class B : A
   {
   }

   class C : A
   {
   }

   static class EnumerableHelper
   {
       public static IEnumerable<T> Merge<T>(this IEnumerable<IEnumerable<T>> Enumerable)
       {
           foreach (IEnumerable<T> En in Enumerable)
           {
               foreach (T t in En)
               {
                   yield return t;
               }
           }
       }
   }

   class Program
   {
       static void Main(string[] args)
       {
           IEnumerable<A> List1 = new List<B>();
           IEnumerable<A> List2 = new List<C>();
           List<IEnumerable<A>> SuperList = new List<IEnumerable<A>>() { List1, List2 };
           IEnumerable<A> MergeEnumerable = SuperList.Merge();
       }
   }
37 cViper
 
07.09.11
16:20
(33) Так это стандартный вектор векторов. В него можно вставлять и удалять вектора.
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.