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

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

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

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

07.07.2015, 02:40. Просмотров 802. Ответов 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++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
hoggy
6369 / 2587 / 452
Регистрация: 15.11.2014
Сообщений: 5,723
Завершенные тесты: 1
07.07.2015, 19:43     Как записать два разных класса в массив? #21
Цитата Сообщение от Croessmah Посмотреть сообщение
в данном случае как-то слишком сильно...
я врать не буду, но вроде бы он полностью совместим с с99.

Цитата Сообщение от ValeryS Посмотреть сообщение
например абстрактный класс
плохой пример.

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

его размер принципиально не может быть меньше, чем sizeof(void*).
догадайтесь, почему.

Цитата Сообщение от ValeryS Посмотреть сообщение
это я такк примеру назвал 100 байт, а ежли в самом большом десятки и сотни килобайт а в маленьком один два байта? сколько памяти зазря утечет?
а это от программиста зависит.
ежели он диструктор напишит,
стало быть ничего не утечет.

Кликните здесь для просмотра всего текста
что касается перерасхода памяти:
ну тупо ездить по болотам на спортивном каре.
зато по городу девчонок цеплять можно.


Цитата Сообщение от ValeryS Посмотреть сообщение
чтобы не было такой бяки
я сначала никак в толк взять не мог:
накой такое вообще может быть нужным?

а потом мне один хороший человек объяснил,

что это такая киллер-фича сишная:
структуры переменной длины.


C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
struct Data
{
    size_t size;
    char data[0];
};
 
Data* create(const size_t size)
{
    Data* data = static_cast<Data*>(malloc(sizeof(Data) + size));
    data->size = size;
    return data;
}
 
void use(Data* data)
{
    for(size_t i = 0; i < data->size; ++i)
        data->data[i] = 123;
}
а вот почти тоже самое на плюсиках:

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
#include <iostream>
#include <cstring>
#include <cstdlib>
 
struct Response
{
    Response(int code, char const * str)
        : code_(code)
    { std::memcpy(data_, str, size_); }
 
    char * data()            { return data_;              }
    char const * data()const { return data_;              }
    size_t size() const      { return size_;              }
    size_t length() const    { return std::strlen(data_); }
    int code() const         { return code_;              }
 
    void* operator new(size_t size, size_t length)
    {
        Response * ptr = (Response*)std::malloc(size + sizeof(char) * length);
        if(ptr)
            ptr->size_ = length + 1;
        
        return ptr;
    }
    void operator delete(void* ptr) { std::free(ptr); }
 
private:
    int const code_;
    size_t    size_;
    char      data_[1];
};
 
int main()
{
    const char ptr[] = "privet mir";
 
    Response * resp = new(std::strlen(ptr)) Response(1, ptr);
 
    std::cout << resp->code()   << std::endl;
    std::cout << resp->data()   << std::endl;
    std::cout << resp->size()   << std::endl;
    std::cout << resp->length() << std::endl;
    delete resp;
}
как гриццо, каждый мопед под свою задачу.
кому то массивы-зоопарки.
а кому структуры динамических размеров.
ValeryS
Модератор
6539 / 5005 / 461
Регистрация: 14.02.2011
Сообщений: 16,648
07.07.2015, 20:57     Как записать два разных класса в массив? #22
Цитата Сообщение от hoggy Посмотреть сообщение
ежели он диструктор напишит,
стало быть ничего не утечет.
именно диструктор
еще раз
ты предлагаешь запихивать объекты( а не указатели на них) в массив, приведя их к большему размеру
Цитата Сообщение от hoggy Посмотреть сообщение
нужно организовать такой размер элемента массива,
который гарантированно (с учетом выравнивания)
вмещает в себя весь зоопарк типов,
типа
C++
1
2
3
4
5
6
7
8
9
struct A
{
int a[64];
}
struc B
{
int b;
int reserved[63];
}
или
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct A
{
int a[64];
}
struc B
{
int b;
}
 
union AB
{
A aa;
B bb;
}
так или нет ?
если так то прикинь какие "дыры" будут при занесении в массив объектов типа B?
и какой деструктор от этого спасет?

Добавлено через 2 минуты
Цитата Сообщение от hoggy Посмотреть сообщение
вы хотя б иногда, прежде чем писать попробуйте хотя б проверить:
скомпилять, да посмотреть.
его размер принципиально не может быть меньше, чем sizeof(void*).
догадайтесь, почему.
размер кого? объекта абстрактного класса? а как его создать?
hoggy
6369 / 2587 / 452
Регистрация: 15.11.2014
Сообщений: 5,723
Завершенные тесты: 1
07.07.2015, 21:10     Как записать два разных класса в массив? #23
Цитата Сообщение от ValeryS Посмотреть сообщение
еще раз
ты предлагаешь запихивать объекты
вы спросили, как это можно сделать.
я - ответил.

зачем вам это было нужно - ваши трудности.

а вообще, такие механизмы существуют.
и у них есть своя область применения.


Цитата Сообщение от ValeryS Посмотреть сообщение
размер кого? объекта абстрактного класса? а как его создать?
да да, размер объекта абстрактного класса.
ну или размер самого абстрактного класса.

Кликните здесь для просмотра всего текста
это я вам так намекаю:
что бы узнать размер объекта,
совершенно не обязательно его создавать.


судя по вашему вопросу, вы так и не озадачились,
почему он принципиально не может быть меньше, чем sizeof(void*)
ValeryS
Модератор
6539 / 5005 / 461
Регистрация: 14.02.2011
Сообщений: 16,648
07.07.2015, 21:21     Как записать два разных класса в массив? #24
Цитата Сообщение от hoggy Посмотреть сообщение
судя по вашему вопросу, вы так и не озадачились,
почему он принципиально не может быть меньше, чем sizeof(void*)
А че мне озадачиваться
указатель на таблицу виртуальных функций
но мир крутится не только вокруг x86, и никто не гарантировал что виртуальные функции будут реализоваться не так а этак
Цитата Сообщение от hoggy Посмотреть сообщение
зачем вам это было нужно - ваши трудности.
Нам??? Вообще то ТС не я
Я бы это отсек еще на этапе проектирования
Ko
-65 / 5 / 0
Регистрация: 23.12.2011
Сообщений: 246
07.07.2015, 23:46  [ТС]     Как записать два разных класса в массив? #25
а как добавить в код thread-safe защиту?
xEmpire
23 / 23 / 9
Регистрация: 07.12.2012
Сообщений: 169
Завершенные тесты: 1
08.07.2015, 00:42     Как записать два разных класса в массив? #26
Ev[G]eN, чем использование RTTI может быть лучше вызова перегруженного виртуального метода?

ValeryS, ну так в union же тоже структура данных будет занимать столько, сколько требует член с макс. расходами памяти.
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
 
union Foo{
    int x;
    double y; 
};
 
int main()
{
    Foo f = {42};
  std::cout << sizeof(f);
}

Ko, монитор | lock-free?
ValeryS
Модератор
6539 / 5005 / 461
Регистрация: 14.02.2011
Сообщений: 16,648
08.07.2015, 01:15     Как записать два разных класса в массив? #27
Цитата Сообщение от xEmpire Посмотреть сообщение
ValeryS, ну так в union же тоже структура данных будет занимать столько, сколько требует член с макс. расходами памяти.
так и я про тоже
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.07.2015, 19:52     Как записать два разных класса в массив?
Еще ссылки по теме:
C++ Как записать Short в два char'a?
Как два одномерных масива записать в один? C++
Как записать 64-битное число в два 32 битных C++
C++ Как правильно записать наследника от такого класса?
как тут эту программу через два класса сделать ? C++

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

Или воспользуйтесь поиском по форуму:
hoggy
6369 / 2587 / 452
Регистрация: 15.11.2014
Сообщений: 5,723
Завершенные тесты: 1
08.07.2015, 19:52     Как записать два разных класса в массив? #28
Цитата Сообщение от ValeryS Посмотреть сообщение
Нам???
это ведь вы написали, а не ТС:

Цитата Сообщение от ValeryS Посмотреть сообщение
размер class_a два байта, а class_b 100 байт,а class_base вообше 0, допустим
как их положить в массив???
и именно вы получили ответ на свой вопрос.

Цитата Сообщение от Ko Посмотреть сообщение
thread-safe защиту?
мутексы/шмутиксы/спинлоки.

Добавлено через 5 минут
Цитата Сообщение от ValeryS Посмотреть сообщение
указатель на таблицу виртуальных функций
замечательно.


Цитата Сообщение от ValeryS Посмотреть сообщение
но мир крутится не только вокруг x86, и никто не гарантировал что виртуальные функции будут реализоваться не так а этак
конечно, конкретная реализация действительно
unspecified behavior.


только причем тут x86?
думаете, что на какой нибудь AMD (или просто другой платформе)
вирт. функции как то по другому устроенны?
Yandex
Объявления
08.07.2015, 19:52     Как записать два разных класса в массив?
Ответ Создать тему
Опции темы

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