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

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

Войти
Регистрация
Восстановить пароль
 
zasadadada
8 / 9 / 1
Регистрация: 03.05.2013
Сообщений: 533
#1

Инициализация объекта из массива объктов класса - C++

31.03.2015, 22:12. Просмотров 528. Ответов 8
Метки нет (Все метки)

Ребята подскажите, как создать массив объектов класса с инициализацией каждого?
C++
1
2
3
4
CLASS1* class1;  //нужно к примеру 5 объектов
class1[0] = new CLASS1[0](....); //  ?????????????
class1[1] = new CLASS1[1](....); //  ?????????????
.........
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.03.2015, 22:12
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Инициализация объекта из массива объктов класса (C++):

Указатель и инициализация объекта класса - C++
Здраствуйте! Имеется большой класс импортирующий данные из файлов 3D-модели. В моём приложении он будет инициализироваться один раз для...

Инициализация константного статического объекта - члена класса - C++
Здравствуйте, у меня возникла проблема с инициализацией статического объекта, который является членом класса. Этот объект должен быть...

Как организовать счетчик объктов класса? - C++
Привет всем; что-то не получается сделать подсчёт объектов класса делаю так: #include <iostream> class MyClass { ...

Инициализация массива строк внутри класса - C++
Доброго времени суток! Есть такая проблема... Дан класс, в нем есть массив строк и мне нужно в конструкторе ему задать начальное значение,...

Возвращение объекта класса из i-го элемента массива - C++
Доброго времени суток! Помогите, пожалуйста, с выполнением задания лаб. работы. Необходимо написать функцию, которая б возвращала...

Создать класс CheckerBoard (особенности строения класса - инициализация константных членов класса) - C++
Вот код: #include <iostream> #include <string> using namespace std; const int xSize = 1; const int ySize = 1; class...

8
Gr1f0nn
242 / 162 / 74
Регистрация: 30.09.2012
Сообщений: 690
31.03.2015, 22:30 #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
class A
{
private:
    string test;
public:
    A() {}
    A(string s) { test = s; }
    ~A() {}
    string get() { return test; }
    void set(string s) { test = s; }
};
 
int main()
{
    A s("test");
    cout << s.get();
 
    A *f;
    f = new A[5];
    for(int i = 0 ; i<5 ; ++i)
    {
        f[i].set("massive");
        cout << f[i].get() << endl;
    }
    delete[] f;
    return 0;
}
Можно, например, так. Соответственно, обращаться к объектам можно также:
C++
1
2
3
4
f[0] ...
f[1]...
...
f[n]...
0
zasadadada
8 / 9 / 1
Регистрация: 03.05.2013
Сообщений: 533
31.03.2015, 22:42  [ТС] #3
C++
1
f = new A[5];
А таким образом конструктор не установлен, у меня обязательны параметры для конструктора, придётся метод добавлять, и через него.
0
Avazart
Эксперт С++
7586 / 5571 / 330
Регистрация: 10.12.2010
Сообщений: 24,997
Записей в блоге: 17
31.03.2015, 22:49 #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class A
{
private:
    string test_;
public:
    A(string s):test_(s){}
    string get() { return test; }
};
 
int main()
{ 
    A* *a = new A[5];
    for(int i = 0 ; i<5 ; ++i)
    {
        a[i]= new A("string");
        cout << a[i]->get() << endl;
    }
 
    for(int i = 0 ; i<5 ; ++i) delete a[i];
    delete[] a;
    return 0;
}
0
zasadadada
8 / 9 / 1
Регистрация: 03.05.2013
Сообщений: 533
31.03.2015, 22:58  [ТС] #5
на данный момент структура примерно такая
C++
1
2
3
4
class CLASS1{
public:
   CLASS1::CLASS1(int a, int b, int c);
}
Конструктор должен принимать параметры. Вот и думаю, может ну его, вынести всё в другой метод. Инициализация не проходит без указания параметров, а если указывать то только для одного экземпляра.
0
Avazart
31.03.2015, 23:01
  #6

Не по теме:

Кто вас научил давать имена классам в апкейсе?

0
zasadadada
8 / 9 / 1
Регистрация: 03.05.2013
Сообщений: 533
31.03.2015, 23:07  [ТС] #7
Avazart а кто мне запрещает это делать? Кому как удобно.
0
Avazart
Эксперт С++
7586 / 5571 / 330
Регистрация: 10.12.2010
Сообщений: 24,997
Записей в блоге: 17
31.03.2015, 23:13 #8

Не по теме:

Цитата Сообщение от zasadadada Посмотреть сообщение
Avazart а кто мне запрещает это делать?
Уважение к другим.



Добавлено через 3 минуты
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
#include <iostream>
using namespace std;
 
class Class
{
    public:
     Class(int a, int b, int c)
         :a_(a),b_(b),c_(c){ cout<<"Class()"<<endl;  };
 
     void print()
     {
         cout<<a_<<" "<<b_<<" "<<c_<<endl;
     }
 
    private:
        int a_,b_,c_;
};
 
 
int main()
{
    Class array[2]={ Class(1,11,111),
                     Class(2,22,222) };
 
    for(int i=0;i<2; ++i)
     array[i].print();
 
    return 0;
}
http://ideone.com/LLq03O
0
DrOffset
7517 / 4513 / 1025
Регистрация: 30.01.2014
Сообщений: 7,362
01.04.2015, 00:29 #9
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от zasadadada Посмотреть сообщение
у меня обязательны параметры для конструктора
С++ way:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<vector>
 
class MyClass
{
public:
    MyClass(int a, int b, char c)
        : a(a), b(b), c(c)
    {}
    MyClass()
        : a(), b(), c()
    {}
 
private:
    int  a;
    int  b;
    char c;
};
 
int main()
{
    std::vector<MyClass> arr(2, MyClass(1,2,3));
}
Если параметры нужны для каждого элемента разные, то в С++11 есть синтаксис для этого.
Вариант с вектором:
C++
1
2
3
4
int main()
{
    std::vector<MyClass> arr{ MyClass(1,2,3), MyClass(4,5,6) };
}
Вариант с new:
C++
1
2
3
4
int main()
{
    MyClass * arr = new MyClass[2]{ MyClass(1,2,3), MyClass(4,5,6) };
}
Что касается инициализации всех элементов массива, выделенного через new с использованием конструктора с параметрами: в GCC есть расширение, которое позволяет писать так:
C++
1
2
3
4
int main()
{
    MyClass * arr = new MyClass[2](1,2,3);
}
Но это нестандартное поведение.
Есть способ проэмулировать такое, но стандартными средствами, написав свою функцию распределения памяти для массивов:
Кликните здесь для просмотра всего текста
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
#include <cstring>
#include <cassert>
#include <new>
 
namespace detail
{
 
    template <typename T>
    void destroy(T * ptr, size_t n)
    {
        while(n-- > 0)
        {
            (ptr + n)->~T();
        }
    }
 
}
 
template <typename T>
void arrayFree(T * ptr)
{
    if(ptr)
    {
        size_t n;
        uint8_t * raw = reinterpret_cast<uint8_t *>(ptr) - sizeof(n);
        std::memcpy(&n, raw, sizeof(n));
        detail::destroy(ptr, n);
 
        ::operator delete(raw);
    }
}
 
template <typename T, typename ...Args>
T * arrayAlloc(size_t n, Args && ...args)
{
    assert(n > 0 && "Array size must be greater than 0.");
    uint8_t * raw = static_cast<uint8_t *>(::operator new(n * sizeof(T) + sizeof(n)));
    if(!raw)
    {
        throw std::bad_alloc();
    }
    std::memcpy(raw, &n, sizeof(n));
 
    T * data = reinterpret_cast<T *>(raw + sizeof(n));
    size_t i = 0;
    try
    {
        for(; i < n; ++i)
        {
            ::new(data + i) T(std::forward<Args>(args)...);
        }
    }
    catch(...)
    {
        detail::destroy(data, i);
        ::operator delete(raw);
        throw;
    }
    return data;
}
 
int main()
{
    MyClass * arr = arrayAlloc<MyClass>(2, 1, 2, 3);
 
    arrayFree(arr);
}

Это вариант для С++11. Для С++03 и ниже можно использовать для инициализации конструктор копирования.
Тогда вариант использования будет таким:
C++
1
2
3
4
5
6
int main()
{
    MyClass * arr = arrayAlloc<MyClass>(2, MyClass(1, 2, 3));
 
    arrayFree(arr);
}
По сути, код под спойлером это примерно то, что реализует под капотом std::vector. Итого не вижу объективных причин, чтобы его (std::vector) сразу не использовать в твоей ситуации и не писать велосипеды.
8
01.04.2015, 00:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.04.2015, 00:29
Привет! Вот еще темы с ответами:

Инициализация членов дочернего класса членами класса родителя - C++
Есть уже созданный класс-родитель A. Как эффективно инициализировать дочерний класс B членами класса A?

BST дерево. Инициализация класса внутри класса - C++
Здравствуйте, нужно реализовать класс дерева бинарного поиска с использованием итератора. Возник вопрос, как инициализировать через...

Инициализация объектов класса в конструкторе другого класса - C++
У меня есть класс Subscriber,в котором есть несколько объектов другого класса Date,мне нужно,чтобы при создании Subscriber объекты класса...

инициализация объекта - C++
Как проинициализировать объект созданный с помощью new?


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

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