Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > operator = для объекта, содержащего CStdioFile


Автор: 5kill 16.6.2011, 11:15
Приветствую всех.

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

Подскажите, плз, как обойти эти трудности.

Автор: Alca 16.6.2011, 13:12
Шеф, где код?

Автор: 5kill 16.6.2011, 14:55
Вот деструктор и оператор копирования для варианта со ссылкой на 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;
}

Автор: borisbn 16.6.2011, 15:40
Думаю лучше всего хранить shared_ptr< CStdioFile * >
Код

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

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

Автор: Alca 16.6.2011, 18:19
http://www.cs.caltech.edu/courses/cs11/material/cpp/donnie/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;
  }

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

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

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

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

В итоге я отказался от оператора присваивания, использовав ссылки на объекты этого класса.
Спасибо всем за помощь, многие советы были полезными.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)