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

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

Восстановить пароль Регистрация
 
 
Ko
 Аватар для Ko
-65 / 5 / 0
Регистрация: 23.12.2011
Сообщений: 246
07.07.2015, 02:40     Как записать два разных класса в массив? #1
допустим есть
C++
1
2
3
vector<class_a> cont_a;
vector<class_b> cont_b;
// тут мы их заполнили допустим по 800 элементов в каждом векторе.
и как их засунуть в один массив ну к примеру в vector тоже?

мне на ум идёт только создать vector с указателями и брать указатель каждого элемента из контейнеров cont_a/cont_b и впиндюривать в vector c указателями. может есть более грамотный ход?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 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
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,057
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
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
07.07.2015, 21:10     Как записать два разных класса в массив? #23
Цитата Сообщение от ValeryS Посмотреть сообщение
еще раз
ты предлагаешь запихивать объекты
вы спросили, как это можно сделать.
я - ответил.

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

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


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

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


судя по вашему вопросу, вы так и не озадачились,
почему он принципиально не может быть меньше, чем sizeof(void*)
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,057
07.07.2015, 21:21     Как записать два разных класса в массив? #24
Цитата Сообщение от hoggy Посмотреть сообщение
судя по вашему вопросу, вы так и не озадачились,
почему он принципиально не может быть меньше, чем sizeof(void*)
А че мне озадачиваться
указатель на таблицу виртуальных функций
но мир крутится не только вокруг x86, и никто не гарантировал что виртуальные функции будут реализоваться не так а этак
Цитата Сообщение от hoggy Посмотреть сообщение
зачем вам это было нужно - ваши трудности.
Нам??? Вообще то ТС не я
Я бы это отсек еще на этапе проектирования
Ko
 Аватар для 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
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,057
08.07.2015, 01:15     Как записать два разных класса в массив? #27
Цитата Сообщение от xEmpire Посмотреть сообщение
ValeryS, ну так в union же тоже структура данных будет занимать столько, сколько требует член с макс. расходами памяти.
так и я про тоже
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.07.2015, 19:52     Как записать два разных класса в массив?
Еще ссылки по теме:

Массив разных объектов внутри класса C++
C++ Разнести данные и методы в два разных класса
C++ Как вывести два массива разных сортировок?

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

Или воспользуйтесь поиском по форуму:
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 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     Как записать два разных класса в массив?
Ответ Создать тему
Опции темы

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