Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
1 / 1 / 0
Регистрация: 12.05.2010
Сообщений: 25
1

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

12.05.2010, 13:28. Показов 2602. Ответов 27
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Подскажите как создать массив из конструкторов определенного класса.

Приведу пример:
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(); // доступ
Есть ли какой более удобный способ без конструктора по умолчанию и счетчика?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.05.2010, 13:28
Ответы с готовыми решениями:

запуск конструкторов
class String { private: strCount* psc; public: ...

Наследование конструкторов
Здрасти. Такая проблема. У меня есть классы с таким наследованием:...

Перегрузка конструкторов
Написал прогу - в зависимости от ввода даты печатает ее в определенном формате: файл date.h...

вызовы конструкторов
обьясните вызов конструторов #include <iostream> using namespace std; class ar { int...

27
Ignat
12.05.2010, 14:04
  #2

Не по теме:


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

0
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 ? как?
0
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
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;
}
1
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;
}
0
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
12.05.2010, 14:51 6
а если объектов класса 100000?
Можно.
а именно, что значит ":a(0){}" и ":a(b){}" после конструкторов?
Это инициализация до тела конструктора, имеет важную необходимость если работаешь
не просто со стандартными типами , а работаешь с собственными типами объектов.
Про инициализацию до тела конструктора можешь почитать в литературе по C++,
там еще важные моменты есть, которые мне объяснять неохото.

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

Добавлено через 2 минуты
Инициализация до тела используется также: для инициализации ссылок и констант объекта класса.
2
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]
}
0
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
12.05.2010, 15:15 8
Вызывается операция присваивания надеюсь вам это о чем нибудь говорит.

Добавлено через 36 секунд
И то по идеи должна быть ошибка потому как такой операции присваивания по умолчанию нет.
0
Фрилансер
3705 / 2077 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
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;
}
0
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"}; //массив объектов.
    // Для трех объектов вызван первый пользовательский конструктор, 
    // для трех следующих - второй пользовательский конструктор, 
        // для остальных конструктор по умолчанию
 
}
Как инициализировать очень большое число объектов через цикл?
0
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
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. Инициализация - при создании объектов, остальное операция присваивания.
Через цикл можешь проделать, пример выше.
Только ты будешь проделывать уже не инициализацию, а присваивание для
каждого объекта из массива.
1
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]
}
0
Фрилансер
3705 / 2077 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
12.05.2010, 15:47 13
Цитата Сообщение от Genius Ignat Посмотреть сообщение
должна быть ошибка потому как такой операции присваивания по умолчанию нет.
Вот как раз присваивание по умолчанию есть, выполняется тупым копированием памяти объекта.
Вечный источник ошибок..

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


Не по теме:


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

2
Фрилансер
3705 / 2077 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
12.05.2010, 15:53 15
Цитата Сообщение от sphere Посмотреть сообщение
Как я понял, можно перегрузить операцию = для моего класса и создать массив из объектов через цикл
1) Объекты в Вашем примере к моменту цикла уже созданы - с конструктором по умолчанию
2) Зачем Вам обязательно перегружать присваивание? Может, проще сделать какой-нибудь метод типа MyClass::Init(int N) - на мой взгляд, будет гораздо нагляднее, чем соображать про перегруженное присваивание
2
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};
0
Фрилансер
3705 / 2077 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
12.05.2010, 16:02 17
Цитата Сообщение от Genius Ignat Посмотреть сообщение
Такой операции по умолчанию нет
Ну да, эта зараза вызовет конструктор MyClass(int), сотворит временный объект, а потом будет его присваивать. Впрочем, может, и с оптимизирует - смотреть надо..


Не по теме:

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

0
1 / 1 / 0
Регистрация: 12.05.2010
Сообщений: 25
12.05.2010, 16:03  [ТС] 18
Или реализации через внутренний счетчик (см. первый пост) - это единственно реализуемый вариант в таком случае?
0
332 / 247 / 32
Регистрация: 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));
1
1 / 1 / 0
Регистрация: 12.05.2010
Сообщений: 25
12.05.2010, 16:20  [ТС] 20
Можно вопрос, а что значит "std::" перед "vector<MyClass> mas;" пространство имен?
0
12.05.2010, 16:20
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.05.2010, 16:20
Помогаю со студенческими работами здесь

Наследование конструкторов
Здравствуйте, мне нужно что бы player наследовал конструктор от aobject class aobject { public:...

Виды конструкторов
Какие конструкторы существуют в С++? Инфу с вики читал, но почему то все равно ответ не верен. ...

Перегрузка конструкторов
Добрый день знатоки С++ возник вопрос Код этой программы компилируется в CodeBlocks а на...

Виды конструкторов
Допустим, я создал класс. В нём - три конструктора. class checker { int number; int x;...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru