Ko
5 / 5 / 2
Регистрация: 23.12.2011
Сообщений: 280
1

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

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

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

мне на ум идёт только создать vector с указателями и брать указатель каждого элемента из контейнеров cont_a/cont_b и впиндюривать в vector c указателями. может есть более грамотный ход?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.07.2015, 02:40
Ответы с готовыми решениями:

Два разных массива записать последовательно в третий
Пожалуйста помогите! Ввод-два массива разной длинны.Записать в третий-сначала идут элементы...

Разнести данные и методы в два разных класса
Товарищи скорректируйте в какую сторону двигаться. Есть задача создать библиотеку из двух классов....

Создать два класса с одинаковым именем в разных пространствах имен
создать два класса с одинаковым именем, которые находятся в разных пространствах имён, например т1,...

Массив разных объектов внутри класса
Хочу сделать что-то типа системы событий и их обработчиков. Есть класс Window и класс Control, от...

27
18337 / 9522 / 2327
Регистрация: 30.01.2014
Сообщений: 16,630
07.07.2015, 02:53 2
Ko, как вариант: http://rextester.com/PKEXS98226
1
Модератор
Эксперт по электронике
8844 / 6624 / 902
Регистрация: 14.02.2011
Сообщений: 23,317
07.07.2015, 03:02 3
Цитата Сообщение от Ko Посмотреть сообщение
и как их засунуть в один массив ну к примеру в vector тоже?
в общем случае никак, массив для однотипных данных, можно конечно повыеживатся
Цитата Сообщение от Ko Посмотреть сообщение
мне на ум идёт только создать vector с указателями
по моему,самое разумное решение

Добавлено через 2 минуты
а может сделать массив из двух указателей, один на cont_a; другой на cont_b;
и работать как с двумерным
0
503 / 246 / 74
Регистрация: 31.10.2010
Сообщений: 742
07.07.2015, 04:11 4
Можно ещё создать структуру содержащую эти массивы.
0
77 / 77 / 30
Регистрация: 21.05.2015
Сообщений: 257
07.07.2015, 09:05 5
class_a и class_b унаследовать от какого-то class_base, создать std::vector<class_base> и складывать туда class_a и class_b, правда нужно продумать как потом разбираться где-какой чтоб правильно приводить к нужному типу.

или создать std::vector<void*> но тогда тоже надо потом как-то разбираться где что.
2
693 / 303 / 99
Регистрация: 04.07.2014
Сообщений: 843
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;
}
Складывать в одну кучу следует только родственные объекты, так что следует завести родительский класс. И всё станет проще.
1
Модератор
Эксперт по электронике
8844 / 6624 / 902
Регистрация: 14.02.2011
Сообщений: 23,317
07.07.2015, 10:44 7
Цитата Сообщение от sashatref Посмотреть сообщение
создать std::vector<class_base> и складывать туда class_a и class_b, правда нужно продумать как потом разбираться где-какой чтоб правильно приводить к нужному типу.
размер class_a два байта, а class_b 100 байт,а class_base вообше 0, допустим
как их положить в массив???
0
77 / 77 / 30
Регистрация: 21.05.2015
Сообщений: 257
07.07.2015, 10:51 8
размер class_a два байта, а class_b 100 байт,а class_base вообше 0, допустим
как их положить в массив???
храните в массиве указатели
1
Неэпический
17848 / 10616 / 2049
Регистрация: 27.09.2012
Сообщений: 26,686
Записей в блоге: 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
0
Mobile Software Engineer
Эксперт С++
5381 / 1585 / 956
Регистрация: 23.01.2011
Сообщений: 3,214
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;
}
1
693 / 303 / 99
Регистрация: 04.07.2014
Сообщений: 843
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, Только вот кто будет память освобождать?
0
Mobile Software Engineer
Эксперт С++
5381 / 1585 / 956
Регистрация: 23.01.2011
Сообщений: 3,214
07.07.2015, 11:49 12
AlexVRud, пускай ТС освобождает я на ideone писал
0
Эксперт С++
8737 / 4315 / 960
Регистрация: 15.11.2014
Сообщений: 9,762
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 писал
наш человек!
а то достали уже со своими утечками :p

0
Неэпический
17848 / 10616 / 2049
Регистрация: 27.09.2012
Сообщений: 26,686
Записей в блоге: 1
07.07.2015, 12:06 14
Цитата Сообщение от hoggy Посмотреть сообщение
по этой причине даже пустые структуры имеют отличный от нуля размер.
А в gcc встречается и такое: http://rextester.com/NASI82143
0
Эксперт С++
8737 / 4315 / 960
Регистрация: 15.11.2014
Сообщений: 9,762
07.07.2015, 12:17 15
Цитата Сообщение от Croessmah Посмотреть сообщение
А в gcc встречается и такое: http://rextester.com/NASI82143
ну это потому что он сишку любит.
0
Неэпический
17848 / 10616 / 2049
Регистрация: 27.09.2012
Сообщений: 26,686
Записей в блоге: 1
07.07.2015, 12:20 16
Цитата Сообщение от hoggy Посмотреть сообщение
ну это потому что он сишку любит.
в данном случае как-то слишком сильно...
0
Модератор
Эксперт по электронике
8844 / 6624 / 902
Регистрация: 14.02.2011
Сообщений: 23,317
07.07.2015, 15:07 17
Цитата Сообщение от hoggy Посмотреть сообщение
по этой причине даже пустые структуры имеют отличный от нуля размер.
например абстрактный класс
Цитата Сообщение от AlexVRud Посмотреть сообщение
class Base {
public:
* virtual std::string getName() = 0;
};
Цитата Сообщение от hoggy Посмотреть сообщение
принципиальная схема:
нужно организовать такой размер элемента массива,
который гарантированно (с учетом выравнивания)
вмещает в себя весь зоопарк типов,
с которым ему предстоит работать.
это я такк примеру назвал 100 байт, а ежли в самом большом десятки и сотни килобайт а в маленьком один два байта? сколько памяти зазря утечет?
Цитата Сообщение от sashatref Посмотреть сообщение
храните в массиве указатели
ну а я при что?
Цитата Сообщение от ValeryS Посмотреть сообщение
по моему,самое разумное решение
Добавлено через 1 минуту
Цитата Сообщение от Croessmah Посмотреть сообщение
А в gcc встречается и такое:
это ты размеры взял
а теперь адреса возьми адреса то не совпадут, что явно говорить, что хоть один байт но туда запихивают
0
Неэпический
17848 / 10616 / 2049
Регистрация: 27.09.2012
Сообщений: 26,686
Записей в блоге: 1
07.07.2015, 15:14 18
Цитата Сообщение от ValeryS Посмотреть сообщение
адреса то не совпадут, что явно говорить, что хоть один байт но туда запихивают
Про адреса никто и не говорил. И, кстати, в силу размера 0, "сбивается" адресация в массиве (все элементы расположены по одному адресу): http://rextester.com/BCY43461
0
Модератор
Эксперт по электронике
8844 / 6624 / 902
Регистрация: 14.02.2011
Сообщений: 23,317
07.07.2015, 15:23 19
Цитата Сообщение от Croessmah Посмотреть сообщение
И, кстати, в силу размера 0, "сбивается" адресация в массиве
Тады ой и ах
не могу апеллировать к стандарту, но во всех книгах,кои я читал, (времен 286 процессора)говорилось чтобы не было такой бяки, и сделано что даже нулевой элемент( с размером 0) должон иметь размер хотя бы байт
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
07.07.2015, 15:38 20
Цитата Сообщение от ValeryS Посмотреть сообщение
во всех книгах
Не те книги читаешь.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.07.2015, 15:38
Помогаю со студенческими работами здесь

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

Как два класса разместить в одну строку, но с разных сторон?
Сейчас код такой HTML &lt;body&gt; &lt;div class=&quot;nav&quot;&gt; &lt;ul class=&quot;left&quot;&gt; ...

В одной форме два разных класса
InitializeComponent() для inputBox_edit() не реализуется namespace stratConv { public...

Записать две строки в два разных массива
работа с файлами Ребят вот как ввести 2 строки у которых длина ну скажем 3000 ?? вот напр ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru