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

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

Войти
Регистрация
Восстановить пароль
 
lion_wine
8 / 8 / 0
Регистрация: 08.03.2014
Сообщений: 101
#1

Динамическая память и конструктор класса - C++

26.04.2014, 23:29. Просмотров 263. Ответов 5
Метки нет (Все метки)

Подскажите, почему
C++
1
Marshroute *objects2 = new Marshroute[n + 1](for_loop);
компилятор ругается на (for_loop), если я хочу запустить конструктор не по умолчанию.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.04.2014, 23:29     Динамическая память и конструктор класса
Посмотрите здесь:

C++ Динамическая память
C++ Динамическая память
Динамическая память C++
C++ Динамическая память
C++ динамическая память....
C++ Динамическая память с++
Динамическая память C++
Динамическая память C++
Динамическая память C++
C++ Написать инструкцию выделения памяти для одного экземпляра заданного класса (динамическая память)
C++ Динамическая память C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
12890 / 7276 / 811
Регистрация: 27.09.2012
Сообщений: 17,975
Записей в блоге: 2
Завершенные тесты: 1
26.04.2014, 23:31     Динамическая память и конструктор класса #2
Цитата Сообщение от lion_wine Посмотреть сообщение
если я хочу запустить конструктор не по умолчанию.
синтаксис new-expression не поддерживает создание массива объектов конструкторами с параметрами
lion_wine
8 / 8 / 0
Регистрация: 08.03.2014
Сообщений: 101
26.04.2014, 23:38  [ТС]     Динамическая память и конструктор класса #3
если убрать [n+1] все компилируется, например, для создания временного контейнера (уже опробовано). А как можно, тогда обойти, не запуская конструктор по умолчанию?
Croessmah
Модератор
Эксперт CЭксперт С++
12890 / 7276 / 811
Регистрация: 27.09.2012
Сообщений: 17,975
Записей в блоге: 2
Завершенные тесты: 1
27.04.2014, 00:02     Динамическая память и конструктор класса #4
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
#include <iostream>
class A{
public:
  A() {
    std::cout << "call A()" << std::endl ;
  }
  A(int x) {
    std::cout << "call A(" << x << ")" << std::endl ;
  }
  ~A() {
    std::cout << "call ~A" << std::endl ;
  }
} ;
 
 
A * allocateA ( size_t size ) {
  A * buffer = static_cast<A*> ( operator new (sizeof(A) * size) ) ;
  for ( size_t i = 0 ; i < size ; ++i ) {
    new (buffer+i) A ( i ) ;
  }
  return buffer ;
}
 
void deallocateA ( A * buffer , size_t size ) {
  for ( size_t i = 0 ; i < size ; ++i ) {
    buffer[i].~A() ;
  }
  operator delete ( buffer ) ;
}
 
int main( int argc, char ** argv )
{
  size_t size = 5 ;
  A * a = allocateA ( size ) ;
  deallocateA ( a , size ) ;
}
DrOffset
6859 / 4070 / 927
Регистрация: 30.01.2014
Сообщений: 6,867
27.04.2014, 00:09     Динамическая память и конструктор класса #5
Цитата Сообщение от lion_wine Посмотреть сообщение
если убрать [n+1] все компилируется, например, для создания временного контейнера (уже опробовано).
Да. Для создания отдельных объектов - работает, для массивов - нет.
Цитата Сообщение от lion_wine Посмотреть сообщение
А как можно, тогда обойти, не запуская конструктор по умолчанию?
Как вариант, использовать вектор:
C++
1
std::vector<Marshroute> objects2(n + 1, Marshroute(for_loop));
В GCC есть расширение, которое позволяет запись из твоего первого поста. Но код потеряет переносимость.

Еще можно определить собственную функцию создания массивов с конструкторами (код С++11):
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
template <typename T, typename ...Args>
T * alloc_array(size_t count, Args... args)
{
    if(void * pRaw = std::malloc(sizeof(size_t) + sizeof(T) * count))
    {
        std::memcpy(pRaw, &count, sizeof(size_t));
        T * pArr = reinterpret_cast<T*>(static_cast<char *>(pRaw) + sizeof(size_t));
        for(size_t i = 0; i < count; ++i)
        {
            ::new(pArr + i) T(args...);
        }
        return pArr;
    }
    throw std::bad_alloc();
}
 
template <typename T>
void delete_array(T * pArr)
{
    if(pArr != nullptr)
    {
        void * pRaw  = reinterpret_cast<char*>(pArr) - sizeof(size_t);
        size_t count;
        std::memcpy(&count, pRaw, sizeof(size_t));
        for(int i = count - 1; i >= 0; --i)
        {
            (pArr + i)->~T();
        }
        std::free(pRaw);
    }
}
 
int main(int argc, char *argv[])
{
    Test * p = alloc_array<Test>(1, 5);
 
    delete_array(p);
}
lion_wine
8 / 8 / 0
Регистрация: 08.03.2014
Сообщений: 101
27.04.2014, 00:20  [ТС]     Динамическая память и конструктор класса #6
спасибо, исчерпывающе)
Yandex
Объявления
27.04.2014, 00:20     Динамическая память и конструктор класса
Ответ Создать тему
Опции темы

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