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

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

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

Показать сообщение отдельно
hoggy
6652 / 2840 / 486
Регистрация: 15.11.2014
Сообщений: 6,285
Завершенные тесты: 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 писал
наш человек!
а то достали уже со своими утечками

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