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

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

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

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

07.07.2015, 02:40. Просмотров 847. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.07.2015, 02:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как записать два разных класса в массив? (C++):

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

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

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

Как вывести два массива разных сортировок? - C++
Необходимо сделать одну программу , где нужно вывести сначала неотсортированный массив, затем один массив отсортированный вставками, и один...

Как переместить из стека одного класса в массив другого класса? - C++
// HW_on.24.11_classStack_SantaClaus.cpp: определяет точку входа для консольного приложения. // #include &quot;stdafx.h&quot; #include...

Массив объектов класса как член другого класса - C++
Здравствуйте. У меня тут возникла проблемка #include &quot;main.h&quot; class player { public: player(); player(char*); ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Croessmah
Эксперт CЭксперт С++
13232 / 7504 / 846
Регистрация: 27.09.2012
Сообщений: 18,433
Записей в блоге: 3
Завершенные тесты: 1
07.07.2015, 12:20 #16
Цитата Сообщение от hoggy Посмотреть сообщение
ну это потому что он сишку любит.
в данном случае как-то слишком сильно...
0
ValeryS
Модератор
6633 / 5040 / 466
Регистрация: 14.02.2011
Сообщений: 16,850
07.07.2015, 15:07 #17
Цитата Сообщение от hoggy Посмотреть сообщение
по этой причине даже пустые структуры имеют отличный от нуля размер.
например абстрактный класс
Цитата Сообщение от AlexVRud Посмотреть сообщение
class Base {
public:
* virtual std::string getName() = 0;
};
Цитата Сообщение от hoggy Посмотреть сообщение
принципиальная схема:
нужно организовать такой размер элемента массива,
который гарантированно (с учетом выравнивания)
вмещает в себя весь зоопарк типов,
с которым ему предстоит работать.
это я такк примеру назвал 100 байт, а ежли в самом большом десятки и сотни килобайт а в маленьком один два байта? сколько памяти зазря утечет?
Цитата Сообщение от sashatref Посмотреть сообщение
храните в массиве указатели
ну а я при что?
Цитата Сообщение от ValeryS Посмотреть сообщение
по моему,самое разумное решение
Добавлено через 1 минуту
Цитата Сообщение от Croessmah Посмотреть сообщение
А в gcc встречается и такое:
это ты размеры взял
а теперь адреса возьми адреса то не совпадут, что явно говорить, что хоть один байт но туда запихивают
0
Croessmah
Эксперт CЭксперт С++
13232 / 7504 / 846
Регистрация: 27.09.2012
Сообщений: 18,433
Записей в блоге: 3
Завершенные тесты: 1
07.07.2015, 15:14 #18
Цитата Сообщение от ValeryS Посмотреть сообщение
адреса то не совпадут, что явно говорить, что хоть один байт но туда запихивают
Про адреса никто и не говорил. И, кстати, в силу размера 0, "сбивается" адресация в массиве (все элементы расположены по одному адресу): http://rextester.com/BCY43461
0
ValeryS
Модератор
6633 / 5040 / 466
Регистрация: 14.02.2011
Сообщений: 16,850
07.07.2015, 15:23 #19
Цитата Сообщение от Croessmah Посмотреть сообщение
И, кстати, в силу размера 0, "сбивается" адресация в массиве
Тады ой и ах
не могу апеллировать к стандарту, но во всех книгах,кои я читал, (времен 286 процессора)говорилось чтобы не было такой бяки, и сделано что даже нулевой элемент( с размером 0) должон иметь размер хотя бы байт
0
Enno
266 / 169 / 38
Регистрация: 25.08.2014
Сообщений: 1,088
Записей в блоге: 1
07.07.2015, 15:38 #20
Цитата Сообщение от ValeryS Посмотреть сообщение
во всех книгах
Не те книги читаешь.
0
hoggy
Нарушитель
6589 / 2770 / 476
Регистрация: 15.11.2014
Сообщений: 6,123
Завершенные тесты: 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;
}
как гриццо, каждый мопед под свою задачу.
кому то массивы-зоопарки.
а кому структуры динамических размеров.
0
ValeryS
Модератор
6633 / 5040 / 466
Регистрация: 14.02.2011
Сообщений: 16,850
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*).
догадайтесь, почему.
размер кого? объекта абстрактного класса? а как его создать?
0
hoggy
Нарушитель
6589 / 2770 / 476
Регистрация: 15.11.2014
Сообщений: 6,123
Завершенные тесты: 1
07.07.2015, 21:10 #23
Цитата Сообщение от ValeryS Посмотреть сообщение
еще раз
ты предлагаешь запихивать объекты
вы спросили, как это можно сделать.
я - ответил.

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

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


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

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


судя по вашему вопросу, вы так и не озадачились,
почему он принципиально не может быть меньше, чем sizeof(void*)
0
ValeryS
Модератор
6633 / 5040 / 466
Регистрация: 14.02.2011
Сообщений: 16,850
07.07.2015, 21:21 #24
Цитата Сообщение от hoggy Посмотреть сообщение
судя по вашему вопросу, вы так и не озадачились,
почему он принципиально не может быть меньше, чем sizeof(void*)
А че мне озадачиваться
указатель на таблицу виртуальных функций
но мир крутится не только вокруг x86, и никто не гарантировал что виртуальные функции будут реализоваться не так а этак
Цитата Сообщение от hoggy Посмотреть сообщение
зачем вам это было нужно - ваши трудности.
Нам??? Вообще то ТС не я
Я бы это отсек еще на этапе проектирования
0
Ko
-65 / 5 / 0
Регистрация: 23.12.2011
Сообщений: 246
07.07.2015, 23:46  [ТС] #25
а как добавить в код thread-safe защиту?
0
xEmpire
25 / 25 / 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?
0
ValeryS
Модератор
6633 / 5040 / 466
Регистрация: 14.02.2011
Сообщений: 16,850
08.07.2015, 01:15 #27
Цитата Сообщение от xEmpire Посмотреть сообщение
ValeryS, ну так в union же тоже структура данных будет занимать столько, сколько требует член с макс. расходами памяти.
так и я про тоже
0
hoggy
Нарушитель
6589 / 2770 / 476
Регистрация: 15.11.2014
Сообщений: 6,123
Завершенные тесты: 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 (или просто другой платформе)
вирт. функции как то по другому устроенны?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.07.2015, 19:52
Привет! Вот еще темы с ответами:

Разное значение переменной класса, в разных экземплярах класса - C++
Вот примерный код: class Test { private: static int countC; static int countD; void initWeight(){ double a; ...

как сделать чтобы объект производного класса сам себя добавлял в список или массив указателей базового класса? - C++
я хотел так, но программа просто падает void Student::add(Base** head) { cout &lt;&lt; &quot;I here&quot; &lt;&lt; endl; this-&gt;setName(); //все...

Как записать два массива в файл ? - C++
Здравствуйте . У меня такая задача : Есть два массива. int h4 ={2,33,4,55,78,3,11,22,33,99,0,45,66,111,123,234,456,765,44,33}; ...

Как записать Short в два char'a? - C++
Есть переменная типа short необходимо записать ее в чаровский массив... как то там через указатели как я хз((((


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
08.07.2015, 19:52
Ответ Создать тему
Опции темы

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