Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/21: Рейтинг темы: голосов - 21, средняя оценка - 4.62
29 / 58 / 6
Регистрация: 10.01.2011
Сообщений: 1,231
1

Создание объекта динамически с конструктором

04.06.2015, 03:18. Показов 4386. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! Подскажите как реализовать такой псевдокод:
C++
1
2
ClassA* Obj = new ClassA(10,20)[10];// КлассА имеет конструктор в который передается несколько параметров.
//Здесь же создается 10 динамических объектов. Как правильно такое написать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.06.2015, 03:18
Ответы с готовыми решениями:

Динамическое создание объекта, в динамически созданном объекте
В StackPanel динамически создан Grid, в котором нужно динамически создать Картинку и несколько...

Ошибка инициализации объекта, конструктором класса
Добрый день. Написал программу. Создание класса (упражнение из книги Дейтеля) "Создайте класс...

Получение объекта connection созданного конструктором
Никак не могу найти как получить объект connection если база данных подключена с помощью "Мастер...

Задание начальных значений объекта класса конструктором
здравствуйте, форумчане. подскажите, пожалуйта, можно ли реализовать следующее: нужно создать...

11
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
04.06.2015, 03:30 2
C++
1
2
3
4
ClassA** Obj = new ClassA* [10];// КлассА имеет конструктор в который передается несколько параметров.
   //Здесь же создается 10 динамических объектов. Как правильно такое написать?
    for (int i = 0; i < 10; ++i)
        Obj[i] = new ClassA(10, 20);
1
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
04.06.2015, 04:06 3
фиговый вариант:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    std::allocator < A > alloc ;
    size_t count = 10 ;
    A * p = alloc.allocate ( count ) ;
    std::for_each (
        p ,
        p + count ,
        [&alloc](A&pObj)
        {
            alloc.construct ( &pObj , 10 , 20 ) ;
        }
    ) ;
 
    std::for_each (
        p ,
        p + count ,
        [&alloc](A&pObj)
        {
            alloc.destroy ( &pObj ) ;
        }
    ) ;
    alloc.deallocate ( p , count ) ;
1
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
04.06.2015, 06:00 4
Placement new специально для этого и придуман
https://ru.wikipedia.org/wiki/New_(C%2B%2B)
пример почти что из вики
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 #include <new> // Необходим для использования placement new
 
 
  const int n = 50;
  ClassA* placementMemory = static_cast<ClassA*>(operator new[] (n * sizeof(ClassA)));// выделение памяти
  for (int i = 0; i < n; i++)
  {
      new (placementMemory + i) ClassA(10,20); //здесь память для объекта не выделяется, но инициализируется
  }
.................................
  
 
  //!!деинициализация памяти
  for (int i = 0; i < n; i++)
  {
      placementMemory[i].~ClassA();
  }
  operator delete[] (placementMemory);
1
29 / 58 / 6
Регистрация: 10.01.2011
Сообщений: 1,231
04.06.2015, 14:58  [ТС] 5
фиговый вариант:
Это ваш или предыдущий? Наверно как то не очень прозвучало, извините, я не пытаюсь шутить, просто первый вариант простой, а у вас сложный

Добавлено через 4 минуты
lss
Я про такой вариант знал, просто мне интересно возможно ли таким способом это сделать, вот на простом примере:
C++
1
2
3
4
5
6
7
8
9
ClassA* A = new ClassA[10];
A[0].Init();
// а можно 
ClassA* A[10];
for(int i = 0,i<10;i++)
{
    A[i] = new ClassA;
}
A[0]->Init();
Вот хотелось бы узнать возможно ли первым способом сделать с конструктором имеющий параметры
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
04.06.2015, 15:14 6
Если надо на 1 раз, то можешь просто задефайнить входные параметры.
Вообще смотри, если у тебя конструктор класса используется в одном потоке, то можешь сделать static члены класса/глобальные переменные, перед вызовом new их определять и производить вызов, а в конструкторе без аргументов использовать эти переменные.
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
class asd
{
public:
    asd()
    {
        Init(b);
    }
    asd(int _a){Init(_a);}
    ~asd(){}
    static VOID SetB(int _b){b = _b;}
protected:
    static int b;
    int a;
    VOID Init(int _a){a = _a;}
};
int asd::b = 0;
 
int main()
{
    asd::SetB(3);
    asd mas[10];//теперь у тебя 10 элементов инициализированных 3
    asd::SetB(5);
    asd mamas[4];//а теперь ещё 4 инициализированных 5
    return 0;
}
1
29 / 58 / 6
Регистрация: 10.01.2011
Сообщений: 1,231
04.06.2015, 15:38  [ТС] 7
Enno
Интересный пример, спасибо
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
04.06.2015, 16:16 8
Цитата Сообщение от Helldrg Посмотреть сообщение
Вот хотелось бы узнать возможно ли первым способом сделать с конструктором имеющий параметры
С обычным new нужен конструктор без параметров, или использовать буферизованный оператор new(пример ValeryS).
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
04.06.2015, 17:42 9
Цитата Сообщение от lss Посмотреть сообщение
С обычным new нужен конструктор без параметров
Или со всеми параметрами, заданными по умолчанию. Проще говоря, default constructor.
Цитата Сообщение от lss Посмотреть сообщение
буферизованный оператор new
Размещающий же.

Helldrg, как вариант можешь использовать вектор, заполненный эталонным элементом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <vector>
 
struct C
{
    explicit C(int) {}
};
 
int main() {
    
    std::vector<C> v(10, C(42));
    
    return 0;
}
1
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
04.06.2015, 17:48 10
Цитата Сообщение от Tulosba Посмотреть сообщение
Размещающий же.
Вот этот?
Миниатюры
Создание объекта динамически с конструктором  
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
04.06.2015, 17:54 11
Цитата Сообщение от lss Посмотреть сообщение
Вот этот?
Это что за перевод (книга)?
Стандарт 5.3.4/11:
The new-placement syntax is used to supply additional arguments to an allocation function.
Дословный перевод placement - размещение.
1
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
04.06.2015, 18:08 12
Цитата Сообщение от Tulosba Посмотреть сообщение
Это что за перевод (книга)?
Скотт Мейерс "Наиболее эффективное использование C++". 2000.
Перевод такой. В оригинале:
Placement new
There are times when you really want to call a constructor directly. Invoking
a constructor on an existing object makes no sense, because
constructors initialize objects, and an object can only be initialized —
given its first value — once. But occasionally you have some raw memory
that’s already been allocated, and you need to construct an object
in the memory you have. A special version of operator new called
placement new allows you to do it.
Добавлено через 5 минут

Не по теме:

Мудро поступают те, кто пишет без перевода, по английски. Например, instance, некоторые категорически не согласны с тем, что это экземпляр.

1
04.06.2015, 18:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.06.2015, 18:08
Помогаю со студенческими работами здесь

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

Как вызвать другой конструктор для уже созданного объекта конструктором по умолчанию?
Есть класс в котором несколько конструкторов, Мне в некоторых местах нужно создавать объекты класса...

В чем разница между конструктором по умолчанию и конструктором с параметрами?
Объясните пожалуйста в чем разница между конструктором по умолчанию и конструктором с параметрами,...

Создание класса с определенным конструктором
Добрый день! Буду благодарен если поможете создать класс VectorEntry который будет...


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

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