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

Массив из конструкторов - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
sphere
1 / 1 / 0
Регистрация: 12.05.2010
Сообщений: 25
12.05.2010, 13:28     Массив из конструкторов #1
Подскажите как создать массив из конструкторов определенного класса.

Приведу пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
static int num1 = 0;
 
...
 
Example::Example() // конструктор
{
   // инициализация элементов-данных, зависящих от num1
   ...
 
   // счетчик
   num1++;
}
 
...
 
Example* exmpl=new Example[exmpl_size]; // создаю exmpl_size объектов класса Example
 
...
 
exmpl[25].paint(); // доступ
Есть ли какой более удобный способ без конструктора по умолчанию и счетчика?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.05.2010, 13:28     Массив из конструкторов
Посмотрите здесь:

Наследование конструкторов? C++
C++ Наследование конструкторов
C++ запуск конструкторов
C++ Конфликт конструкторов.
вызовы конструкторов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Genius Ignat
12.05.2010, 14:04
  #2

Не по теме:


Я не понял суть вопроса.

sphere
1 / 1 / 0
Регистрация: 12.05.2010
Сообщений: 25
12.05.2010, 14:18  [ТС]     Массив из конструкторов #3
Цитата Сообщение от Genius Ignat Посмотреть сообщение

Не по теме:


Я не понял суть вопроса.

Подскажите как создать массив из конструкторов определенного класса. Есть ли какой более удобный способ без конструктора по умолчанию и счетчика?

Сначала задать конструктор:
C++
1
2
3
4
5
Example::Example(int n) // конструктор
{
   // инициализация элементов-данных, зависящих от n
   ...
}
а потом создать массив объектов класса Example ? как?
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
12.05.2010, 14:24     Массив из конструкторов #4
Такой пример пойдет
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
using namespace std;
 
class MyClass {
int a;
public:
    MyClass():a(0){}          //конструктор по умолчанию он еще ни кому не мешал.
    MyClass(int b):a(b){};    //пользовательский конструктор.
 
 
};
 
int main(){
    MyClass mas[10] = {1,2,3}; //массив объектов.
    //Для трех объектов вызван пользовательский конструктор для остальных конструктор по умолчанию
 
 
 
 
return 0;
}
sphere
1 / 1 / 0
Регистрация: 12.05.2010
Сообщений: 25
12.05.2010, 14:40  [ТС]     Массив из конструкторов #5
а можно пояснить запись:
C++
1
2
        MyClass():a(0){}          //конструктор по умолчанию он еще ни кому не мешал.
        MyClass(int b):a(b){};    //пользовательский конструктор.
а именно, что значит ":a(0){}" и ":a(b){}" после конструкторов?

а если объектов класса 100000?

Добавлено через 8 минут
Я правильно понимаю запись?
Цитата Сообщение от Genius Ignat Посмотреть сообщение
Такой пример пойдет
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
using namespace std;
 
class MyClass 
{
private:
   int a;
public:
   MyClass(){a=0};          //конструктор по умолчанию он еще ни кому не мешал.
   MyClass(int b){a=b};    //пользовательский конструктор.  
};
 
int main()
{
    MyClass mas[10] = {1,2,3}; //массив объектов.
    //Для трех объектов вызван пользовательский конструктор для остальных конструктор по умолчанию
 
return 0;
}
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
12.05.2010, 14:51     Массив из конструкторов #6
а если объектов класса 100000?
Можно.
а именно, что значит ":a(0){}" и ":a(b){}" после конструкторов?
Это инициализация до тела конструктора, имеет важную необходимость если работаешь
не просто со стандартными типами , а работаешь с собственными типами объектов.
Про инициализацию до тела конструктора можешь почитать в литературе по C++,
там еще важные моменты есть, которые мне объяснять неохото.

В данном примере суть сильно не изменить потому как используются обычные арифметические типы,
Можешь инициализировать и в теле конструктора.
MyClass(){a=0;}
MyClass(int b){a = b;}

Добавлено через 2 минуты
Инициализация до тела используется также: для инициализации ссылок и констант объекта класса.
sphere
1 / 1 / 0
Регистрация: 12.05.2010
Сообщений: 25
12.05.2010, 15:12  [ТС]     Массив из конструкторов #7
Цитата Сообщение от Genius Ignat Посмотреть сообщение
Можно.
Я правильно понимаю, что это сработает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
...
MyClass::MyClass(int b)
{
   a=b;
 
  // инициализация элементов-данных объекта, например
  x=a+1;
  y=a+2;
  z=a+3;
  k=x+y+z;
  ...
}
 
...
MyClass mas[100000];
...
for (int i=0; i<100000; i++)
{
   mas[i]=2*i+1; // вызывается конструктор MyClass с параметром [B]?[/B] и создается объект(-элемент массива) mas[i] с параметром 2*i+1 [B]?[/B]
}
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
12.05.2010, 15:15     Массив из конструкторов #8
Вызывается операция присваивания надеюсь вам это о чем нибудь говорит.

Добавлено через 36 секунд
И то по идеи должна быть ошибка потому как такой операции присваивания по умолчанию нет.
Black Fregat
 Аватар для Black Fregat
1353 / 983 / 215
Регистрация: 31.05.2009
Сообщений: 4,093
12.05.2010, 15:32     Массив из конструкторов #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Более того, сработает даже так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;
 
class MyClass {
int a;
public:
    MyClass():a(0){}          //конструктор по умолчанию он еще ни кому не мешал.
    MyClass(int b):a(b){};    //пользовательский конструктор.
    MyClass(char* c):a(*c){};    //еще пользовательский конструктор.
 
};
 
int main(){
    MyClass mas[10] = {1,2,3,"a","b","c"}; //массив объектов.
    // Для трех объектов вызван первый пользовательский конструктор, 
    // для трех следующих - второй пользовательский конструктор, 
        // для остальных конструктор по умолчанию
 
return 0;
}
sphere
1 / 1 / 0
Регистрация: 12.05.2010
Сообщений: 25
12.05.2010, 15:34  [ТС]     Массив из конструкторов #10
Цитата Сообщение от Genius Ignat Посмотреть сообщение
Вызывается операция присваивания надеюсь вам это о чем нибудь говорит.

Добавлено через 36 секунд
И то по идеи должна быть ошибка потому как такой операции присваивания по умолчанию нет.
т.е. я должен еще сделать перегрузку оператора = , чтобы a=b?

Добавлено через 1 минуту
Цитата Сообщение от Black Fregat Посмотреть сообщение
Более того, сработает даже так:
C++
1
2
3
4
5
6
    MyClass mas[10] = {1,2,3,"a","b","c"}; //массив объектов.
    // Для трех объектов вызван первый пользовательский конструктор, 
    // для трех следующих - второй пользовательский конструктор, 
        // для остальных конструктор по умолчанию
 
}
Как инициализировать очень большое число объектов через цикл?
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
12.05.2010, 15:42     Массив из конструкторов #11
sphere:
А что вы собственно хотите сделать, если вы изучаете язык, почитайте по лучше соответствующие книги и вопросы ставьте по-человечески, я до сих пор не могу понять его смысл.

Что бы выполнить что вы хотите нужно сделать следующее,
реализовать перегруженную версию операции присваивания и все.
Пример ниже.

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 MyClass {
 
int a;
public:
    MyClass(): a(0){}          //конструктор по умолчанию он еще ни кому не мешал.
    MyClass(int b): a (b){};    //пользовательский конструктор.
    
    //Нужно сделать перегруженную версию операции присваивания.
    const MyClass& operator = (int r){
    a = r;
    return *this;
    }
 
};
 
int main(){
    MyClass mas[100000] = {1,2,3}; //массив объектов.
    //Для трех объектов вызван пользовательский конструктор для остальных конструктор по умолчанию
 
MyClass obj1,obj2(2);
obj1=obj2;
obj1 = 20;
mas[0] = 20;
 
return 0;
}
Добавлено через 1 минуту
Black Fregat:
Перегрузку конструктор показал. +1

Добавлено через 5 минут
Как инициализировать очень большое число объектов через цикл?
1. Инициализация - при создании объектов, остальное операция присваивания.
Через цикл можешь проделать, пример выше.
Только ты будешь проделывать уже не инициализацию, а присваивание для
каждого объекта из массива.
sphere
1 / 1 / 0
Регистрация: 12.05.2010
Сообщений: 25
12.05.2010, 15:44  [ТС]     Массив из конструкторов #12
Цитата Сообщение от Genius Ignat Посмотреть сообщение
sphere:
А что вы собственно хотите сделать, если вы изучаете язык, почитайте по лучше соответствующие книги и вопросы ставьте по-человечески, я до сих пор не могу понять его смысл.
Да, может я некорректно выразился. Мне нужно создать очень большое число объектов моего класса, например, 100000. Кажется логичным решить эту задачу, создав массив из объектов. Далее все упирается как? Как я понял, можно перегрузить операцию = для моего класса и создать массив из объектов через цикл:
C++
1
2
3
4
5
6
MyClass mas[100000];
...
for (int i=0; i<100000; i++)
{
   mas[i]=2*i+1; // вызывается конструктор MyClass с параметром [B]?[/B] и создается объект(-элемент массива) mas[i] с параметром 2*i+1 [B]?[/B]
}
Black Fregat
 Аватар для Black Fregat
1353 / 983 / 215
Регистрация: 31.05.2009
Сообщений: 4,093
12.05.2010, 15:47     Массив из конструкторов #13
Цитата Сообщение от Genius Ignat Посмотреть сообщение
должна быть ошибка потому как такой операции присваивания по умолчанию нет.
Вот как раз присваивание по умолчанию есть, выполняется тупым копированием памяти объекта.
Вечный источник ошибок..

Вообще, с копированием объектов лучше связываться на более продвинутом этапе понимания.
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
12.05.2010, 15:51     Массив из конструкторов #14
const MyClass& operator = (int r)
Такой операции по умолчанию нет, слово по-умлочанию для меня не что другое.
И я бы не говорил про перегрузку операции присваивания, если бы не знал что стандартная уже
существует.


Не по теме:


Все умываю руки, благодарностей все равно не будет ладно разбирайтесь сами
и так дофига времени потратил.

Black Fregat
 Аватар для Black Fregat
1353 / 983 / 215
Регистрация: 31.05.2009
Сообщений: 4,093
12.05.2010, 15:53     Массив из конструкторов #15
Цитата Сообщение от sphere Посмотреть сообщение
Как я понял, можно перегрузить операцию = для моего класса и создать массив из объектов через цикл
1) Объекты в Вашем примере к моменту цикла уже созданы - с конструктором по умолчанию
2) Зачем Вам обязательно перегружать присваивание? Может, проще сделать какой-нибудь метод типа MyClass::Init(int N) - на мой взгляд, будет гораздо нагляднее, чем соображать про перегруженное присваивание
sphere
1 / 1 / 0
Регистрация: 12.05.2010
Сообщений: 25
12.05.2010, 16:01  [ТС]     Массив из конструкторов #16
Только ты будешь проделывать уже не инициализацию, а присваивание для
каждого объекта из массива.
если я хочу инициализировать массив, не делая дальнейшего присваивания, как это сделать?

Добавлено через 2 минуты
C++
1
MyClass mas[100000] = {1,2,3};
я же не могу сразу создать массив из 100000 объектов и инициализировать его тут же так, как мне надо (т.е. без конструктора по умолчанию).

Добавлено через 4 минуты
Это далеко не самый лучший способ:
C++
1
MyClass mas[100000] = {0, 1, 2, 3, 4, ...., 99999};
Black Fregat
 Аватар для Black Fregat
1353 / 983 / 215
Регистрация: 31.05.2009
Сообщений: 4,093
12.05.2010, 16:02     Массив из конструкторов #17
Цитата Сообщение от Genius Ignat Посмотреть сообщение
Такой операции по умолчанию нет
Ну да, эта зараза вызовет конструктор MyClass(int), сотворит временный объект, а потом будет его присваивать. Впрочем, может, и с оптимизирует - смотреть надо..


Не по теме:

Цитата Сообщение от Genius Ignat Посмотреть сообщение
Все умываю руки, благодарностей все равно не будет ладно разбирайтесь сами
и так дофига времени потратил.
Ну не дает она мне благодарить - говорит, слишком часто

sphere
1 / 1 / 0
Регистрация: 12.05.2010
Сообщений: 25
12.05.2010, 16:03  [ТС]     Массив из конструкторов #18
Или реализации через внутренний счетчик (см. первый пост) - это единственно реализуемый вариант в таком случае?
Roma_F
331 / 246 / 5
Регистрация: 13.12.2009
Сообщений: 589
12.05.2010, 16:10     Массив из конструкторов #19
sphere, можно ещё так
C++
1
2
3
4
5
    int n = 100000;
    std::vector<MyClass> mas;
    mas.reserve(n);
    for (int i = 0; i < n; i++)
        mas.push_back(MyClass(i));
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.05.2010, 16:20     Массив из конструкторов
Еще ссылки по теме:

Наследование конструкторов C++
Наследование конструкторов C++
C++ Наследование конструкторов

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

Или воспользуйтесь поиском по форуму:
sphere
1 / 1 / 0
Регистрация: 12.05.2010
Сообщений: 25
12.05.2010, 16:20  [ТС]     Массив из конструкторов #20
Можно вопрос, а что значит "std::" перед "vector<MyClass> mas;" пространство имен?
Yandex
Объявления
12.05.2010, 16:20     Массив из конструкторов
Ответ Создать тему
Опции темы

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