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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проблема с выводом в поток. не могу найти ошибку. 
:(
    Опции темы
varnie
Дата 24.7.2008, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



день добрый.
подскажите, плз, как поправить:
Код

class String {
    friend std::ostream &operator<<(std::ostream &s, const String &str);
public:
   //...
private:
    //class for storing String-values
struct StringValue : public RCObject {
        std::ostream &operator<<(std::ostream &s){
           s << _data;
           return s;
        }
        char *_data;
        //...
    };
    RCPtr<StringValue> _value;
};

inline std::ostream &operator<<(std::ostream &s, const String &str) {
   
    s <<  (str._value->_data); //(1)
    s << *(str._value); //(2)
    return s;
}

никак не пойму, почему нельзя заменить строку (1) на строку (2).

класс RCPtr - шаблонная обертка, имеющая перегруженные операторы * и -> , следовательно, в строчке:
*(str._value) мы через operator * в обертке получаем StringValue& и далее (по идее, но почему-то это не так) должен сработать определенный в классе StringValue operator<<, но нет, что-то не получается.
если оставить просто строку (1), то все работает. но мне для понимания хочется разобраться, что сделать, чтобы через строку (2) получилось также вывести в поток str._value->_data...
может кто поможет, подскажет? спасибо.
PM MAIL   Вверх
mes
Дата 24.7.2008, 23:32 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(varnie @  24.7.2008,  23:17 Найти цитируемый пост)

никак не пойму, почему нельзя заменить строку (1) на строку (2).

потому что  при  s << *(str._value); вызывается оператор << класса ostream, а не класса StringValue
для решения замените метод на дружественую функцию как у String  smile 



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


Новичок



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

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



mes, 
верно! работает.
Код

class String {
    
    class StringValue;
    friend std::ostream &operator<<(std::ostream &s, const StringValue &v);
    friend std::ostream &operator<<(std::ostream &s, const String &str);

public:
   //...
private:
    //class for storing String-values
struct StringValue : public RCObject {
       friend std::ostream &operator<<(std::ostream &s, const StringValue &v);

        char *_data;
        //...
    };
    RCPtr<StringValue> _value;
};

inline std::ostream &operator<<(std::ostream &s, const String &str) {
    s << *(str._value);
    return s;
}

inline std::ostream &operator<<(std::ostream &s, const String::StringValue &v) {
    s << v._data;
    return s;
}

спасибо большое за помощь!

Это сообщение отредактировал(а) varnie - 24.7.2008, 23:52
PM MAIL   Вверх
mes
Дата 24.7.2008, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



разместить дружественную функцию для StringValue в классе String и в ней использовать StingValue::оператор<< ()

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


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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