Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > В c-tor передаю ссылку созданного std::ifstream


Автор: EvilsInterrupt 21.8.2011, 17:00
Сложно было описать суть вопроса в теме, поэтому прошу прощения )

В ввиду того что с С++ сейчас все реже и реже контактирую, многое забывается (((

Ситуация проста у меня есть класс, который внутри себя имеет приватные объект std::ifstream и объект еще одного класса созданного мною.
В секции инициализации при попытке создания моего класса передаю ссылку(как я думаю) получаю ошибку компиляции.

Примерный код того что происходит у меня, таков:
Код

class Image
{
public:
    Image( std::iostream& streamRef )
        : stream( streamRef )
    {}
private:
    std::iostream& stream;
};


class Calculator
{
public:
    Calculator()
        : image( srcFile )
    {
    }

    void openSource( const std::string& filename );
private:
    std::ifstream   srcFile;
    Image           image;
};


Ошибка, как вы уже догадались возможно, такая:
Цитата

1>e:\source\proba\proba.cpp(20) : error C2664: 'Image::Image(std::iostream &)' : cannot convert parameter 1 from 'std::ifstream' to 'std::iostream &'


Вопросы:
1) Разрешено ли такое? Мне думается да, ведь объект std::ifstream декларирован раньше, чем объект моего класса и поэтому уже создан!
2) Как лучше спроектировать? Я хочу сделать независимым от стрима класс Image и поэтому принимаю ссылку на стрим.

Автор: boostcoder 21.8.2011, 17:23
http://liveworkspace.org/code/c69579234e34b60e24fe4ae5f2f950e9

Добавлено через 2 минуты и 26 секунд
или так: http://liveworkspace.org/code/0226e7bad31eae2eff8eeb859a6a44c6

Автор: EvilsInterrupt 21.8.2011, 17:30
boostcoder, 
Второй вариант, что был добавлен лучше отражает мое стремление.
Я вижу что дело в том что я должен указать явно std::istream. Но если верить http://cplusplus.com/reference/iostream/iostream/ то разве не могу принимать std::iostream ? он ведь является частично и std::istream-ом!!!

Добавлено через 24 секунды
А вообще спасибо, за попытку помочь! ;)

Автор: mes 21.8.2011, 18:49
Цитата(EvilsInterrupt @  21.8.2011,  16:00 Найти цитируемый пост)
    Calculator()
        : image( srcFile )
 ..

    std::ifstream   srcFile;
   Image           image;

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

Добавлено через 1 минуту и 37 секунд
Цитата(EvilsInterrupt @  21.8.2011,  16:30 Найти цитируемый пост)
Но если верить этой страничке то разве не могу принимать std::iostream ? 

ну прежде всего Вы ifstream хотите использовать как iostream, а он уже поопределению неполон.. 

Автор: EvilsInterrupt 21.8.2011, 19:20
mes, 
Цитата

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

Не исключено! ;))) Но видимо это уже другая тема.

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