Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> конструктор и выделение памяти 
:(
    Опции темы
Mormishka
Дата 12.6.2011, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 236
Регистрация: 25.8.2010

Репутация: нет
Всего: нет



Предположим есть класс
Код

class A
{
public:
    int n;
    A(int n_)
    {
                      n=n_;
    }

};


Я создаю массив объектов этого класса. Здесь естественно ошибка, т.к. конструктора по умолчанию нет.

Код

A* ma;
ma = new A[10];


Вопрос, как выделить память и при этом воспользоваться конструктором A(int n_) ?

Это сообщение отредактировал(а) Mormishka - 12.6.2011, 12:04
PM MAIL   Вверх
volatile
Дата 12.6.2011, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(Mormishka @  12.6.2011,  11:28 Найти цитируемый пост)
Я создаю массив объектов этого класса.

Mormishka, нельзя так сделать.
Насколько помню, инициализатор для массива, созданного при помощи new указать нельзя.



PM MAIL   Вверх
Mormishka
Дата 12.6.2011, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 236
Регистрация: 25.8.2010

Репутация: нет
Всего: нет



Как тогда быть? Мне нужен (1,2,3-мерный) массив  объектов, которые должны быть проинициализированы. 
PM MAIL   Вверх
mes
Дата 12.6.2011, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Mormishka @  12.6.2011,  11:47 Найти цитируемый пост)
Как тогда быть? 

размещающий new придет на помощь smile


--------------------
PM MAIL WWW   Вверх
volatile
Дата 12.6.2011, 13:27 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



или,
std::vector<A> ma(100,5); // 100 штук А инициализированных пятёркой (5)

PM MAIL   Вверх
Mormishka
Дата 12.6.2011, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 236
Регистрация: 25.8.2010

Репутация: нет
Всего: нет



volatile, 
Я как раз отказываюсь от вектора в своей программе. Мне нужно свой класс создать, где будет выделятся память. Как тогда это в векторе реализовано?
PM MAIL   Вверх
borisbn
Дата 12.6.2011, 15:01 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(Mormishka @  12.6.2011,  13:56 Найти цитируемый пост)
Я как раз отказываюсь от вектора в своей программе

Разреши поинтересоваться: по какой причине ? Самоистязание ? Задание в институте ?



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Mormishka
Дата 12.6.2011, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 236
Регистрация: 25.8.2010

Репутация: нет
Всего: нет



borisbn, 
В программе очень нужна производительность, т.к. на каждую итерацию добывляется значение в вектор (push_back), векторов очень много.  Как я понял при выделение памяти в контейнерах память выделяется несколько больше чем необходимо. Отсюда постоянная проверка происходит количества элементов. Легче выделить сразу сколько надо. Хотя вопрос, если reserve использовать (я знаю какое количество элементов мне надо), это ускорит работу? 
PM MAIL   Вверх
mes
Дата 12.6.2011, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Mormishka @  12.6.2011,  14:11 Найти цитируемый пост)
.  Как я понял при выделение памяти в контейнерах память выделяется несколько больше чем необходимо. Отсюда постоянная проверка происходит количества элементов.

Хм.. Вы надеетесь сделать эффективнее, чем сделано в стандартной библиотеке ?
Вначале разочарую : при текущем уровне знаний у Вас не получится даже приблизиться к его эффективности..  
Но также и обрадую : 
1. не вектором единым живет stl, нужно только правильно подобрать под задачу подходящий контейнер..
2. контейнеры stl довольно эффективны, если правильно ими пользоваться и в частности вектор позволяет в ручную указывать кол-во необходимой занимаемой памяти.. 
итого, нужно не выдумать свой велосипед, а хорошо изучить документацию и на основе этого проработать свой алгоритм.. 

Это сообщение отредактировал(а) mes - 12.6.2011, 16:40


--------------------
PM MAIL WWW   Вверх
Mormishka
Дата 12.6.2011, 16:56 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 236
Регистрация: 25.8.2010

Репутация: нет
Всего: нет



mes, 
Понятно. А для чего используют reserve? Для того что лишний раз не выделять память?
PM MAIL   Вверх
mes
Дата 12.6.2011, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



да, если заранее известно кол-во элеметов, то можно зарезервировать память, чтоб исключить автоматическое (неконтролиуемое и ненужное в данном случае) расширение.



--------------------
PM MAIL WWW   Вверх
SVN74
Дата 12.6.2011, 22:02 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 5.5.2008
Где: Комсомольск на Дн епре

Репутация: 1
Всего: 18



Цитата(Mormishka @  12.6.2011,  11:28 Найти цитируемый пост)
Вопрос, как выделить память и при этом воспользоваться конструктором A(int n_) ?

Ну если уж слишком хочется...

A* ma[10];
    for(int i=0;i<10;i++)
    {
        ma[i] = new A(100);
    }
PM MAIL WWW   Вверх
VolgaevLG
Дата 12.6.2011, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 21.12.2010

Репутация: 1
Всего: 1



можешь сделать альтернативный конструктор без параметров, с заданием числа по умолчанию 

Код

class A
{
public:
    int n;

    A(int n_)
    {
                      n=n_;
    }

    A()
    {
                      n=0
    }
    
};


тогда следующий код будет верным

Код

A* ma;
ma = new A[10];






Это сообщение отредактировал(а) VolgaevLG - 12.6.2011, 23:53
PM MAIL   Вверх
volatile
Дата 13.6.2011, 01:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Mormishka, Простой массив инициализировать можно как угодно. В чём может быть проблема?
Можно придумать тысячи способов. Вот, хотя-бы такой.
Код

class A
{
public:
    int n;
    A() { n = default_n; }

    static void set_default (int v) { default_n = v; }
private:
    static int default_n;
};


Инициализировать примерно так:
Код

A::set_default ( 5 ); A* ma = new A[10]; // Создание 10 штук А инициализированных 5
A::set_default ( 3 ); A* mb = new A[10]; // Создание 10 штук А инициализированных 3
A::set_default ( 7 ); A* mc = new A[10]; // Создание 10 штук А инициализированных 7

Этот способ не очень хорош тем, что надо помнить что надо вызывать A::set_default (), перед инициализацией. 
Но кажется это близко к тому что вы хотите?

Добавил:
И еще этот код потокоопасный smile (надеюсь у вас не многопоточное приложение)


Это сообщение отредактировал(а) volatile - 13.6.2011, 06:53
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0627 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.