Поиск:

Ответ в темуСоздание новой темы Создание опроса
> operator = для объекта, содержащего CStdioFile 
:(
    Опции темы
5kill
Дата 16.6.2011, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Приветствую всех.

Возникла проблема с реализацией оператора присваивания для класса, содержащего CStdioFile.
Получить копию CStdioFile мне не удалось... метод Duplicate() в нем не реализован почему-то.
Попробовал вместо CStdioFile хранить ссылку, но тогда после копирования, когда удаляется временный объект вызывается деструктор, который благополучно закрывает файл по ссылке.

Подскажите, плз, как обойти эти трудности.
PM MAIL   Вверх
Alca
Дата 16.6.2011, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Шеф, где код?

Это сообщение отредактировал(а) Alca - 16.6.2011, 18:13


--------------------
PM WWW ICQ Skype Jabber   Вверх
5kill
Дата 16.6.2011, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот деструктор и оператор копирования для варианта со ссылкой на CStdioFile:
Код

CTempFile::~CTempFile(void)
{
    if(File != NULL)
    {
        File->Close();
    }
}

void CTempFile::operator =(CTempFile newValue)
{
    this->File = newValue.File;
    this->DummyRunsNumber = newValue.DummyRunsNumber;
    this->EoF = newValue.EoF;
    this->EoR = newValue.EoR;
    this->FibValue = newValue.FibValue;
    this->IsValid = newValue.IsValid;
    this->LastReadValue = newValue.LastReadValue;
}

PM MAIL   Вверх
borisbn
Дата 16.6.2011, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Думаю лучше всего хранить shared_ptr< CStdioFile * >
Код

void CTempFile::operator =(CTempFile newValue)
{
    this->shared_ptr_to_File = newValue.shared_ptr_to_File;
   ...
}

, а в деструкторе убрать
Код
File->Close();


Это сообщение отредактировал(а) borisbn - 16.6.2011, 15:41


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


Эксперт
****


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

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



http://www.cs.caltech.edu/courses/cs11/mat...ie/cpp-ops.html
Код

MyClass& MyClass::operator=(const MyClass &rhs) {
    // Check for self-assignment!
    if (this == &rhs)      // Same object?
      return *this;        // Yes, so skip assignment, and just return *this.

    ... // Deallocate, allocate new space, copy values...

    return *this;
  }



--------------------
PM WWW ICQ Skype Jabber   Вверх
maxim1000
Дата 16.6.2011, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



есть подозрение, что наличие оператора присваивания для объекта, содержащего обхект для чтения из файла, семантически некорректно

технические трудности, возникающие при его реализации - всего лишь следствие

для того, чтобы дать полезный совет, было бы неплохо увидеть:
1. описание семантики класса, для которого понадобился operator=
2. описание причин, по которым он понадобился


--------------------
qqq
PM WWW   Вверх
5kill
Дата 17.6.2011, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Полностью согласен с тем что архитектура такой реализации не блещет изяществом.
Однако в силу специфики использования данного класса это наиболее разумный по соотношению затрат к результату вариант.

В итоге я отказался от оператора присваивания, использовав ссылки на объекты этого класса.
Спасибо всем за помощь, многие советы были полезными.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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