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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Ko
-65 / 5 / 0
Регистрация: 23.12.2011
Сообщений: 246
#1

Как записать два разных класса в массив? - C++

07.07.2015, 02:40. Просмотров 805. Ответов 27
Метки нет (Все метки)

допустим есть
C++
1
2
3
vector<class_a> cont_a;
vector<class_b> cont_b;
// тут мы их заполнили допустим по 800 элементов в каждом векторе.
и как их засунуть в один массив ну к примеру в vector тоже?

мне на ум идёт только создать vector с указателями и брать указатель каждого элемента из контейнеров cont_a/cont_b и впиндюривать в vector c указателями. может есть более грамотный ход?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.07.2015, 02:40     Как записать два разных класса в массив?
Посмотрите здесь:
C++ Два разных массива записать последовательно в третий
C++ Разнести данные и методы в два разных класса
Массив разных объектов внутри класса C++
C++ Как вывести два массива разных сортировок?
C++ Как переместить из стека одного класса в массив другого класса?
C++ Разное значение переменной класса, в разных экземплярах класса
Как записать два массива в файл ? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6922 / 4115 / 942
Регистрация: 30.01.2014
Сообщений: 6,914
07.07.2015, 02:53     Как записать два разных класса в массив? #2
Ko, как вариант: http://rextester.com/PKEXS98226
ValeryS
Модератор
6542 / 5008 / 461
Регистрация: 14.02.2011
Сообщений: 16,655
07.07.2015, 03:02     Как записать два разных класса в массив? #3
Цитата Сообщение от Ko Посмотреть сообщение
и как их засунуть в один массив ну к примеру в vector тоже?
в общем случае никак, массив для однотипных данных, можно конечно повыеживатся
Цитата Сообщение от Ko Посмотреть сообщение
мне на ум идёт только создать vector с указателями
по моему,самое разумное решение

Добавлено через 2 минуты
а может сделать массив из двух указателей, один на cont_a; другой на cont_b;
и работать как с двумерным
RefSol
228 / 167 / 40
Регистрация: 31.10.2010
Сообщений: 535
07.07.2015, 04:11     Как записать два разных класса в массив? #4
Можно ещё создать структуру содержащую эти массивы.
sashatref
75 / 75 / 27
Регистрация: 21.05.2015
Сообщений: 257
Завершенные тесты: 1
07.07.2015, 09:05     Как записать два разных класса в массив? #5
class_a и class_b унаследовать от какого-то class_base, создать std::vector<class_base> и складывать туда class_a и class_b, правда нужно продумать как потом разбираться где-какой чтоб правильно приводить к нужному типу.

или создать std::vector<void*> но тогда тоже надо потом как-то разбираться где что.
AlexVRud
442 / 152 / 38
Регистрация: 04.07.2014
Сообщений: 426
07.07.2015, 09:13     Как записать два разных класса в массив? #6
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
#include <iostream>
#include <string>
#include <vector>
#include <memory>
 
class Base {
public:
  virtual std::string getName() = 0;
};
 
class Foo: public Base {
public:
  std::string getName() { return std::string("Foo"); };
};
 
class Bar: public Base {
public:
  std::string getName() { return std::string("Bar"); };
};
 
 
int main() {
  std::vector< std::shared_ptr<Base> > xs;
 
  xs.push_back( std::static_pointer_cast<Base>(std::make_shared<Foo>()) );
  xs.push_back( std::static_pointer_cast<Base>(std::make_shared<Bar>()) );
  xs.push_back( std::static_pointer_cast<Base>(std::make_shared<Bar>()) );
  xs.push_back( std::static_pointer_cast<Base>(std::make_shared<Foo>()) );
 
  for(auto x: xs) {
    std::cout << x->getName() << std::endl;
  }
 
  return 0;
}
Складывать в одну кучу следует только родственные объекты, так что следует завести родительский класс. И всё станет проще.
ValeryS
Модератор
6542 / 5008 / 461
Регистрация: 14.02.2011
Сообщений: 16,655
07.07.2015, 10:44     Как записать два разных класса в массив? #7
Цитата Сообщение от sashatref Посмотреть сообщение
создать std::vector<class_base> и складывать туда class_a и class_b, правда нужно продумать как потом разбираться где-какой чтоб правильно приводить к нужному типу.
размер class_a два байта, а class_b 100 байт,а class_base вообше 0, допустим
как их положить в массив???
sashatref
75 / 75 / 27
Регистрация: 21.05.2015
Сообщений: 257
Завершенные тесты: 1
07.07.2015, 10:51     Как записать два разных класса в массив? #8
размер class_a два байта, а class_b 100 байт,а class_base вообше 0, допустим
как их положить в массив???
храните в массиве указатели
Croessmah
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
07.07.2015, 11:19     Как записать два разных класса в массив? #9
Бред, конечно, но
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
46
47
48
49
50
51
52
53
54
55
56
57
#include <iostream>
#include <vector>
#include <string>
 
 
template < typename Type1 , typename Type2 >
struct pointer_pair
{
 
    pointer_pair ( Type1 * pFirst )
        : first ( pFirst )
        , second ( nullptr )
    {
    }
 
    pointer_pair ( Type2 * pSecond )
        : first ( nullptr )
        , second ( pSecond )
    {
    }
    Type1 * first ;
    Type2 * second ;
};
 
 
template < typename T1, typename T2 >
std::ostream & operator << ( std::ostream & stream , const pointer_pair<T1,T2> & obj )
{
    if ( obj.first )
        stream << *obj.first ;
    else if ( obj.second )
        stream << *obj.second ;
    return stream ;
}
 
 
template < typename T >
std::ostream & operator << ( std::ostream & stream , const std::vector<T> & vec )
{
    for ( const auto & e : vec )
        stream << e << '\n' ;
    return stream ;
}
 
 
 
int main()
{
    std::vector < pointer_pair < std::string , double > > vec ;
    vec.push_back ( { new std::string("my string 1") } ) ;
    vec.push_back ( { new std::string("my string 2") } ) ;
    vec.push_back ( { new double(3.14) } ) ;
    vec.push_back ( { new std::string("my string 3") } ) ;
    vec.push_back ( { new double(-0.23) } ) ;
    std::cout << vec << std::endl ;
    //тут delete
}
http://rextester.com/IHYTZ35422
Ev[G]eN
Эксперт С++
5096 / 1534 / 381
Регистрация: 23.01.2011
Сообщений: 3,148
07.07.2015, 11:40     Как записать два разных класса в массив? #10
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
#include <iostream>
#include <vector>
 
class base {
    public:
        virtual ~base() {/*make it polymorphical*/};
};
 
class classA : public base {
    public:
        void methodA() {
            std::cout << "A.methodA()" << std::endl;
        }
};
 
class classB : public base {
    public:
        void methodB() {
            std::cout << "B.methodB()" << std::endl;
        }
};
 
int main() {
    std::vector <base *> vector;
    for (size_t i = 0; i < 10; i++) {
        if (!(i % 2)) {
            vector.push_back(new classA());
        } else {
            vector.push_back(new classB());
        }
    }
    for (base *currentClass : vector) {
        if (dynamic_cast <classA *>(currentClass)) {
            ((classA *)currentClass)->methodA();
        } else {
            ((classB *)currentClass)->methodB();
        }
    }
    
    return 0;
}
AlexVRud
442 / 152 / 38
Регистрация: 04.07.2014
Сообщений: 426
07.07.2015, 11:48     Как записать два разных класса в массив? #11
Цитата Сообщение от sashatref Посмотреть сообщение
правда нужно продумать как потом разбираться где-какой чтоб правильно приводить к нужному типу.
dynamic_cast, но лучше умные указатели и dynamic_pointer_cast
C++
1
2
3
4
    std::shared_ptr<Foo> foo = std::dynamic_pointer_cast<Foo>(x);
    if (foo) {
      std::cout << foo->getFooFoo() << std::endl;
    }
Добавлено через 1 минуту
Ev[G]eN, Только вот кто будет память освобождать?
Ev[G]eN
Эксперт С++
5096 / 1534 / 381
Регистрация: 23.01.2011
Сообщений: 3,148
07.07.2015, 11:49     Как записать два разных класса в массив? #12
AlexVRud, пускай ТС освобождает я на ideone писал
hoggy
6369 / 2587 / 452
Регистрация: 15.11.2014
Сообщений: 5,722
Завершенные тесты: 1
07.07.2015, 11:58     Как записать два разных класса в массив? #13
Цитата Сообщение от ValeryS Посмотреть сообщение
размер class_a два байта, а class_b 100 байт,а class_base вообше 0, допустим
как их положить в массив???
1.
элементом массива не может быть тип с нулевым размером.
по этой причине даже пустые структуры имеют отличный от нуля размер.

2.
принципиальная схема:
нужно организовать такой размер элемента массива,
который гарантированно (с учетом выравнивания)
вмещает в себя весь зоопарк типов,
с которым ему предстоит работать.

пример-иллюстрация:

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
#include <iostream>
 
// --- типы, объекты которых предполагается хранить в зоопарк-массиве.
struct sample1
{
    int ar;
};
 
struct sample2
{
    double v;
};
 
// ---------------------------------------------------
// юнион гарантирует выравнивание
// и адекватный размер элемента массива
 
union element
{
    element(sample1 s)
        :s1(s)
    {}
    
    element(sample2 s)
        :s2(s)
    {}
    
    sample1 s1;
    sample2 s2;
};
 
int main()
{
    std::cout << "Hello, world!\n";
    
    sample1 s1;
    sample2 s2;
   
    // --- и вуаля!
    element arr[] = { s1, s2 };
}
можно приправить эту заготовку шаблонами,
и получить фундервафлю.

в промышленном программировании,
трюк с юнином запросто имитируется за счет
локального хранилища данных, с new placement.


в этом случае схема выглядит так:

http://rextester.com/LOAU3706

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
//Title of this code
//g++  4.9.1
 
#include <iostream>
 
 
struct sample1
{
    int ar;
};
 
struct sample2
{
    double v=25.5;
};
 
 
// --- только для иллюстрации!!!
// не рекомендованно для использования на бою
 
struct wrapper
{
    // в коде отсутствует thread-safe защита
    // в коде отсутствует exception-safe защита
    // в коде отсутствует диструктор, так что могут быть утечки памят
    // не учитывается выравнимвание
    // отсутствует защита типизации и квалификаторов
    
    // и вообще, я вырезал все, что бы не захламлять обзор
    // так что не нужно в таком виде такое использовать
    
    enum { eSIZE = sizeof(sample1)>sizeof(sample2)? sizeof(sample1): sizeof(sample2) };
    
    template<class U>
    wrapper(U&& v)
    {
        typedef typename std::remove_reference<U>::type
            type;
        
        static_assert(
            sizeof(type)<=eSIZE,
            "ERROR: INVALID SIZE"
        );
        
        new (mBuf) type(v);
    }
    
    template<class T>
    operator T&()
    {
        T* p = reinterpret_cast<T*>(mBuf);
        return *p;
    }
    
    char mBuf[eSIZE];
};
 
 
 
 
int main()
{
    std::cout << "Hello, world!\n";
    
    sample1 s1;
    sample2 s2;
    
    
    wrapper arr[] = { s1, s2 };
    
    sample2& ref = arr[1];
    
    std::cout<<"(must be 25.5): " << ref.v <<std::endl;
    
}

вообще, вариантов приготовления можно, наверное, не мало придумать.

Добавлено через 4 минуты

Не по теме:

Цитата Сообщение от Ev[G]eN Посмотреть сообщение
пускай ТС освобождает я на ideone писал
наш человек!
а то достали уже со своими утечками

Croessmah
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
07.07.2015, 12:06     Как записать два разных класса в массив? #14
Цитата Сообщение от hoggy Посмотреть сообщение
по этой причине даже пустые структуры имеют отличный от нуля размер.
А в gcc встречается и такое: http://rextester.com/NASI82143
hoggy
6369 / 2587 / 452
Регистрация: 15.11.2014
Сообщений: 5,722
Завершенные тесты: 1
07.07.2015, 12:17     Как записать два разных класса в массив? #15
Цитата Сообщение от Croessmah Посмотреть сообщение
А в gcc встречается и такое: http://rextester.com/NASI82143
ну это потому что он сишку любит.
Croessmah
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
07.07.2015, 12:20     Как записать два разных класса в массив? #16
Цитата Сообщение от hoggy Посмотреть сообщение
ну это потому что он сишку любит.
в данном случае как-то слишком сильно...
ValeryS
Модератор
6542 / 5008 / 461
Регистрация: 14.02.2011
Сообщений: 16,655
07.07.2015, 15:07     Как записать два разных класса в массив? #17
Цитата Сообщение от hoggy Посмотреть сообщение
по этой причине даже пустые структуры имеют отличный от нуля размер.
например абстрактный класс
Цитата Сообщение от AlexVRud Посмотреть сообщение
class Base {
public:
* virtual std::string getName() = 0;
};
Цитата Сообщение от hoggy Посмотреть сообщение
принципиальная схема:
нужно организовать такой размер элемента массива,
который гарантированно (с учетом выравнивания)
вмещает в себя весь зоопарк типов,
с которым ему предстоит работать.
это я такк примеру назвал 100 байт, а ежли в самом большом десятки и сотни килобайт а в маленьком один два байта? сколько памяти зазря утечет?
Цитата Сообщение от sashatref Посмотреть сообщение
храните в массиве указатели
ну а я при что?
Цитата Сообщение от ValeryS Посмотреть сообщение
по моему,самое разумное решение
Добавлено через 1 минуту
Цитата Сообщение от Croessmah Посмотреть сообщение
А в gcc встречается и такое:
это ты размеры взял
а теперь адреса возьми адреса то не совпадут, что явно говорить, что хоть один байт но туда запихивают
Croessmah
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
07.07.2015, 15:14     Как записать два разных класса в массив? #18
Цитата Сообщение от ValeryS Посмотреть сообщение
адреса то не совпадут, что явно говорить, что хоть один байт но туда запихивают
Про адреса никто и не говорил. И, кстати, в силу размера 0, "сбивается" адресация в массиве (все элементы расположены по одному адресу): http://rextester.com/BCY43461
ValeryS
Модератор
6542 / 5008 / 461
Регистрация: 14.02.2011
Сообщений: 16,655
07.07.2015, 15:23     Как записать два разных класса в массив? #19
Цитата Сообщение от Croessmah Посмотреть сообщение
И, кстати, в силу размера 0, "сбивается" адресация в массиве
Тады ой и ах
не могу апеллировать к стандарту, но во всех книгах,кои я читал, (времен 286 процессора)говорилось чтобы не было такой бяки, и сделано что даже нулевой элемент( с размером 0) должон иметь размер хотя бы байт
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.07.2015, 15:38     Как записать два разных класса в массив?
Еще ссылки по теме:
C++ Как записать Short в два char'a?
Как два одномерных масива записать в один? C++
Как записать 64-битное число в два 32 битных C++
C++ Как правильно записать наследника от такого класса?
как тут эту программу через два класса сделать ? C++

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

Или воспользуйтесь поиском по форуму:
Enno
266 / 169 / 38
Регистрация: 25.08.2014
Сообщений: 1,088
Записей в блоге: 1
07.07.2015, 15:38     Как записать два разных класса в массив? #20
Цитата Сообщение от ValeryS Посмотреть сообщение
во всех книгах
Не те книги читаешь.
Yandex
Объявления
07.07.2015, 15:38     Как записать два разных класса в массив?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru