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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Иниц. структур без вызова конструктора копирования 
:(
    Опции темы
SABROG
Дата 26.9.2008, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Есть класс сторонней библиотеки, в которой запрещен конструктор копирования. Есть вот такая ситуация, где C это и есть класс той самой библиотеки:

Код

class C
{
...
}

class A
{
    A(){};
    ~A(){};
private:
    struct B
    {
        C ccc;
    };
    list <B> lst;
};


В конструктор класса C надо передавать различные параметры и каждый новый экземпляр объекта класса C помещать в список lst. Создание объекта через new использовать не хочу, дабы избежать даже намека на  утечку памяти. Такой способ естественно не работает из-за  попытки вызвать конструктор копирования:

Код

{
    struct B object = {C(arg)};
}


Это сообщение отредактировал(а) SABROG - 26.9.2008, 14:47


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Sartorius
Дата 26.9.2008, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



 Как насчет списка инициализации у B
Код

    struct B 
    {
        B() : ccc(параметры конструктора С) {}
        C ccc;
    };


Это сообщение отредактировал(а) Sartorius - 26.9.2008, 14:54
PM MAIL ICQ   Вверх
Fazil6
Дата 26.9.2008, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(SABROG @  26.9.2008,  14:46 Найти цитируемый пост)
Есть класс сторонней библиотеки, в которой запрещен конструктор копирования.

значит такой объект нельзя копировать, а такие объекты нельзя помещать в контейнер. Тебе нужно определить копирующий конструктор класса B и в нем решать, что делать с С и как его копировать.
PM MAIL   Вверх
maxim1000
Дата 26.9.2008, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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


--------------------
qqq
PM WWW   Вверх
J0ker
Дата 26.9.2008, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



раз копиконстрактор запрещен, значит на то есть причины
как сказали выше - используй shared_ptr:
Код

    struct B
    {
        std::tr1::shared_ptr<C> ccc;
    };
===========
    B object = {std::tr1::shared_ptr<C>(new C(arg))};



--------------------
user posted image
PM MAIL   Вверх
SABROG
Дата 26.9.2008, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Цитата(J0ker @ 26.9.2008,  18:55)
раз копиконстрактор запрещен, значит на то есть причины
как сказали выше - используй shared_ptr:
Код

    struct B
    {
        std::tr1::shared_ptr<C> ccc;
    };
===========
    B object = {std::tr1::shared_ptr<C>(new C(arg))};

Честное слово, чем больше работаю с ЯВУ - тем больше у меня отвращение к нему. А все из-за того, что первым языком программирования который я изучил был ассемблер. Там я мог делать все, причем одну задачу мог выполнить несколькими способами. Тут же мне приходится изучаться синтаксис, чтобы обойти ограничение и я реально теряю много времени на это.

Простейшая задача - записать в область памяти по некому адресу свои данные в момент загрузки программы. В итоге меня отправляют использовать shared_ptr из черновика к новому стандарту. В общем ситуация, когда ЯВУ не помогает написанию программы, а препятствует написанию оной, причем без веских причин.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mes
Дата 26.9.2008, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(SABROG @  26.9.2008,  22:07 Найти цитируемый пост)
Честное слово, чем больше работаю с ЯВУ - тем больше у меня отвращение к нему.

На вкус и цвет товарища нет  smile 
Цитата(SABROG @  26.9.2008,  22:07 Найти цитируемый пост)
А все из-за того, что первым языком программирования который я изучил был ассемблер. 

Тоже проходил асм в самом начале, и именно поэтому люблю Яву, а особенно ООП.
Цитата(SABROG @  26.9.2008,  22:07 Найти цитируемый пост)
Тут же мне приходится изучаться синтаксис, чтобы обойти ограничение и я реально теряю много времени на это.

Значит решаете задачу не тем (не естесственным) путем.

Цитата(SABROG @  26.9.2008,  22:07 Найти цитируемый пост)
Простейшая задача - записать в область памяти по некому адресу свои данные в момент загрузки программы. В итоге меня отправляют использовать shared_ptr из черновика к новому стандарту.

Значит Вы так описали задачу. То что Вам предложили shared_ptr посодействовала фразa:

Цитата(SABROG @  26.9.2008,  14:46 Найти цитируемый пост)
Создание объекта через new использовать не хочу, дабы избежать даже намека на  утечку памяти. 


До этого кстати Вам предложили:

Цитата(Sartorius @  26.9.2008,  14:54 Найти цитируемый пост)
Как насчет списка инициализации у B


Кстати судя по коду , объект класса C полностью контролируем классом хозяином. В таком случае утечки памяти легко исключить.
например использованием std::auto_ptr )

Цитата(SABROG @  26.9.2008,  22:07 Найти цитируемый пост)
В общем ситуация, когда ЯВУ не помогает написанию программы, а препятствует написанию оной, причем без веских причин.

Ага, именно так - ситуация когда программист пытается использовать действия, которые до этого были помечены как опасные. 
Такое препядствие и есть преимущество ЯВУ.
Опишите компилятору , как поступать в случае копирования или не пользуйтесь копированием и  вся проблема уйдет  )  

А программистам, которые лучше компилятора могут проследить за всеми несоответствиями, удержать в памяти все конфликтные места, недопустить и готовы выполнять эту работу вместо компилятора (если конечно такие существуют), лучше использовать Ассемблер ну или на крайний случай Си.
С++ разрабатывался не для них  smile 




Это сообщение отредактировал(а) mes - 26.9.2008, 22:34


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


Explorer
****


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

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



Цитата(SABROG @  26.9.2008,  23:07 Найти цитируемый пост)
Честное слово, чем больше работаю с ЯВУ - тем больше у меня отвращение к нему.

придеться себя пересиливать. Даже такие монстры как Касперски, говорят, что больше 100-200 строк асмв в многотысячном проекте это извращение.


--------------------
Мой блог
PM MAIL WWW   Вверх
J0ker
Дата 26.9.2008, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



std::auto_ptr нельзя использовать в контейнерах

Цитата(SABROG @  26.9.2008,  22:07 Найти цитируемый пост)
Тут же мне приходится изучаться синтаксис, чтобы обойти ограничение и я реально теряю много времени на это.

синтаксис нужно изучать не чтобы, а потомучто
А ограничения существуют не для того, что-бы их обходить. Если копиконстрактор запрещен, значит объект содержит инкапсулированные некопируемые ресурсы. Такая возможность - это достоинство, а не недостаток.

Цитата(SABROG @  26.9.2008,  22:07 Найти цитируемый пост)
Простейшая задача - записать в область памяти по некому адресу свои данные в момент загрузки программы.

как вы задачу сформулировали, так вам и отвечают
Когда вы помещаете объект в лист - то туда помещается не сам объект, а его копия - так работает этот класс. Раз вам это не подходит, значит надо что-то менять в архитектуре.



--------------------
user posted image
PM MAIL   Вверх
mes
Дата 26.9.2008, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(J0ker @  26.9.2008,  22:44 Найти цитируемый пост)
std::auto_ptr нельзя использовать в контейнерах

В контейнер насколько я помню помещается объект класса B, a закрытый конструктор у класса C, 
при этом как я понял B-объект является хранителем, C-объекта . Вот я предложил использовать auto_ptr , чтоб не забыть удалить объект в деструкторе.  ) А чтоб ответить точнее, нужно более точное описание задачи, а не пример готового непонятного решения )

Добавлено через 28 секунд
Цитата(J0ker @  26.9.2008,  22:44 Найти цитируемый пост)
Раз вам это не подходит, значит надо что-то менять в архитектуре.

Склоняюсь к этому же мнению . 


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


Опытный
**


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

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



Цитата(mes @  26.9.2008,  22:59 Найти цитируемый пост)
В контейнер насколько я помню помещается объект класса B, a закрытый конструктор у класса C, 
при этом как я понял B-объект является хранителем, C-объекта .

это не имеет в данном контексте никакого значения - при копировании В все его мемберы копируются. STL контейнеры не гарантируют целостность auto_ptr.


Это сообщение отредактировал(а) J0ker - 26.9.2008, 23:18


--------------------
user posted image
PM MAIL   Вверх
mes
Дата 26.9.2008, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(J0ker @  26.9.2008,  23:13 Найти цитируемый пост)
это не имеет в данном контексте никакого значения - при копировании В все его мемберы копируются. STL контейнеры не гарантируют целостность auto_ptr.

Согласен.. перечитал все заново - я чего то в сторону ушел ) 


--------------------
PM MAIL WWW   Вверх
UnrealMan
Дата 28.9.2008, 01:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(SABROG @  26.9.2008,  15:46 Найти цитируемый пост)
В конструктор класса C надо передавать различные параметры и каждый новый экземпляр объекта класса C помещать в список lst. 

boost::ptr_list отлично для этого подходит.

Добавлено через 1 минуту и 42 секунды
Цитата(mes @  27.9.2008,  00:26 Найти цитируемый пост)
Согласен.. перечитал все заново - я чего то в сторону ушел )  

boost::ptr_list может принимать std::auto_ptr.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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