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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Определить среднее арифметическое каждого столбца и максимум и минимум каждой строки двумерного массива http://www.cyberforum.ru/cpp-beginners/thread1494304.html
Дан двумерный массив 5x6. Определить среднее арифметическое каждого столбца, определить максимум и минимум каждой строки
C++ Вычислить значения функции на заданном промежутке с заданным шагом написать программу вычисления функции на заданном промежутке с шагом 0.2 и построить график этой функции. у={e}^{(-(x+3))} при x>3.61 y=1 при 0\leq x\leq 3.61 y=0.5x при x<0 #include <iostream> #include<iostream.h> #include<conio.h> #include <cmath> using std::cout; http://www.cyberforum.ru/cpp-beginners/thread1494261.html
Вычислить сумму конечного ряда C++
написать программу вычисления суммы конечного ряда. значения x и n вводятся с клавиатуры \sum_{k=1}^{n}((-1)^k*(x+3))/k!
C++ MS Visual Studio 2013 Express при компиляции программа открывается и сразу закрывается
Вот код: #include <iostream> int main() { std::cout << "Hello" << ; system("pause"); return 0; }
C++ Dll. Создание и использование http://www.cyberforum.ru/cpp-beginners/thread1494241.html
Добрый вечер! Не порекомендуете хорошей литературы по созданию и использованию dll библиотек в Windows?
C++ функции в С++ #include <iostream> #include <cmath> #include <iomanip> using namespace std; void Vvod(int* arrA,int n) { for(int i=0;i<n;i++) { cout<<"arrA= "; подробнее

Показать сообщение отдельно
hoggy
5225 / 2116 / 403
Регистрация: 15.11.2014
Сообщений: 4,800
Завершенные тесты: 1
07.07.2015, 11:58     Как записать два разных класса в массив?
Цитата Сообщение от 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 писал
наш человек!
а то достали уже со своими утечками

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