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

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

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

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

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

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

Написать инструкцию выделения памяти для одного экземпляра заданного класса (динамическая память) - C++
Дан класс и указатель: class X{ int a; public: X(int _a) {a = _a;} }; X *p; Напишите инструкцию выделения памяти для...

Будет ли утрачена память, когда конструктор копирования вызывается для уже существующего объекта класса? - C++
class A { char * v; A(); ~A(); A(const A &obj); } ///////////////////// A::A() {

Конструктор класса не видит конструктор по умолчанию другого класса - C++
Ошибка, естественно, в Classes.cpp, в строке 20. Ругается, что у класса TailNode нет конструктора по умолчанию, хотя он там, конечно, есть....

Конструктор производного класса требует конструктор предка - C++
Выдаёт вот такую вот ошибку: no matching function for call to 'Cube::Cube()' class Cube { protected: int magInt; bool...

Статическая память,Динамическая память. - C++
a) Статическая память. Двумерный массив. Дан массив целых чисел. В массиве есть отрицательные числа. Определить координаты левого нижнего...

Динамическая память - C++
Каким способом можно задать динамическую память , кроме как через new ?

5
Croessmah
Эксперт CЭксперт С++
13513 / 7671 / 866
Регистрация: 27.09.2012
Сообщений: 18,885
Записей в блоге: 3
Завершенные тесты: 1
26.04.2014, 23:31 #2
Цитата Сообщение от lion_wine Посмотреть сообщение
если я хочу запустить конструктор не по умолчанию.
синтаксис new-expression не поддерживает создание массива объектов конструкторами с параметрами
0
lion_wine
8 / 8 / 0
Регистрация: 08.03.2014
Сообщений: 101
26.04.2014, 23:38  [ТС] #3
если убрать [n+1] все компилируется, например, для создания временного контейнера (уже опробовано). А как можно, тогда обойти, не запуская конструктор по умолчанию?
0
Croessmah
Эксперт CЭксперт С++
13513 / 7671 / 866
Регистрация: 27.09.2012
Сообщений: 18,885
Записей в блоге: 3
Завершенные тесты: 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 ) ;
}
0
DrOffset
7351 / 4451 / 1009
Регистрация: 30.01.2014
Сообщений: 7,292
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);
}
0
lion_wine
8 / 8 / 0
Регистрация: 08.03.2014
Сообщений: 101
27.04.2014, 00:20  [ТС] #6
спасибо, исчерпывающе)
0
27.04.2014, 00:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.04.2014, 00:20
Привет! Вот еще темы с ответами:

Динамическая память [new] - C++
Если записать так: char *p; p = new char; cin&gt;&gt;p; for(int i=0; i&lt;strlen(p); i++) cout&lt;&lt;p&lt;&lt;endl;

Динамическая память - C++
Всем привет!!! взникла проблема с выполнением строки K=A++; при выполнении printf(&quot;\n__________ %d\n&quot;,K.gasaaa()); получаю левые...

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

динамическая память.... - C++
Ввести двухмерном массив, для работы с массивом использовать указатель. Массив разместить в динамической памяти. Определение суммы...


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

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

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