|
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) Так это стандартный вектор векторов. В него можно вставлять и удалять вектора.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |