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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Снова перегрузка <<, Запись в vector 
:(
    Опции темы
Levenson
Дата 9.12.2006, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем привет! Вот такой вопрос есть класс, с членом mDataMemo типа vector<string>.

Код

class CMediaInfo {
public:
    CMediaInfo();
    
    CMediaInfo(const CMediaInfo& right);
    
    virtual ~CMediaInfo();
 
protected:

    vector<string>& operator<<(const char* sData) {
        mDataMemo.push_back(sData);
        return(mDataMemo);
    }

private:

    vector<string> mDataMemo;
};



Я хочу перегрузить operator<< для того чтобы постоянно не писать mDataMemo.pushback();
Эстественно эта перегрузка должна быть доступна только методам данного класса.

моя реализация smile  ни как не хочет работать.  smile 
подскажите. заранее спасибо
PM MAIL   Вверх
Daevaorn
Дата 9.12.2006, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Levenson @  10.12.2006,  00:22 Найти цитируемый пост)
operator<< для того чтобы постоянно не писать mDataMemo.pushback();

А какая разница? То что ты хочешь нельзя сделать. Вместо операторa напиши функцию add
PM MAIL WWW   Вверх
Levenson
Дата 9.12.2006, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Daevaorn @ 9.12.2006,  23:28)
А какая разница? То что ты хочешь нельзя сделать. Вместо операторa напиши функцию add

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

Код


 mDataMemo << "Aspect ratio: " << ratio;



Как нельзя? Неверю!  smile 
PM MAIL   Вверх
Daevaorn
Дата 9.12.2006, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Levenson @  10.12.2006,  00:37 Найти цитируемый пост)
Как нельзя? Неверю!  

можно сделать глобальный оператор, но тогда он будет виден всем.
PM MAIL WWW   Вверх
Oleg_Ci
Дата 10.12.2006, 06:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


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

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



Возвращать ссылку *this надо, а не ссылку на vector. smile 
Код

class CMediaInfo {

public:
    //CMediaInfo();
    //CMediaInfo(const CMediaInfo& right);
    //virtual ~CMediaInfo();

    CMediaInfo & operator<<(const char* sData) {
        mDataMemo.push_back(string(sData));
        return *this;
    }
private:
    vector<string> mDataMemo;
};

int main(int argc, char *argv[])

    CMediaInfo m;
    m << "asd" << "ertrtg" << "3245kjglk";
    getchar(); // пауза
    return 0;
}

PM MAIL   Вверх
MAKCim
Дата 10.12.2006, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



а можно поизвращатся и сделать так
Код

class CMediaInfo {
private:
    class grabber {
    private:
        CMediaInfo& ref;
    public:
        grabber(const string& value, CMediaInfo& obj)
            : ref(obj) {
            ref.add(value);
        }

        grabber operator,(const string& value) {
            return grabber(value, ref);
        }
    }
public:
    CMediaInfo();
    
    CMediaInfo(const CMediaInfo& right);
    
    virtual ~CMediaInfo();

    grabber operator << (const string& obj) {
        return grabber(obj, *this);
    }

    void add(const string& obj) {
        mDataMemo.push_back(obj);
    }
private:
    vector<string> mDataMemo;
};

и писать можно так
Код

CMediaInfo info;
info << "A" , "B" , "C";



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Levenson
Дата 10.12.2006, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Олег4 @ 10.12.2006,  06:52)
Возвращать ссылку *this надо, а не ссылку на vector. smile

 smile  Этот способ я знаю. Но мне надо было чтобы оператор вызывался в нутри функций-членов класса. 

Код


void CMediaInfo::GetRiffHeaders(string sFullFileName) {

        mDataMemo << sFullFileName.c_str() << " is avi file.";
 }

Мне пришлось делать их глобальными в фаиле реализации. Спасибо Daevaorn. 
Вот что я сделал. Конечно не то чтоя хотел но..

Код

const char _setNewLine[]  = "endl";

inline vector<string>& operator<<(vector<string>& pVec, const char* sData) {

    if ( !strcmp(sData,_setNewLine) ) {
        pVec.push_back("");
    } else {
        if ( pVec.empty() )
            pVec.push_back(sData);
        else {
            string tmp(*--pVec.end());
            tmp += sData;
            pVec.pop_back();
            pVec.push_back(tmp);
        }
    }
    return(pVec);
}

inline vector<string>& operator<<(vector<string>& pVec, string sData) {
    pVec.push_back(sData);
    return(pVec);
}

inline vector<string>& operator<<(vector<string>& pVec, long sData) {
    char* pNum;
    pNum = new char[BufSize];
    _ltoa_s(sData,pNum,BufSize,10);
    pVec.push_back(pNum);
    delete [] pNum;
    return(pVec);
}

inline vector<string>& operator<<(vector<string>& pVec, int sData) {
    char* pNum;
    pNum = new char[BufSize];
    _itoa_s(sData,pNum,BufSize,10);
    pVec.push_back(pNum);
    delete [] pNum;
    return(pVec);
}

inline vector<string>& operator<<(vector<string>& pVec, DWORD sData) {
    char* pNum;
    pNum = new char[BufSize];
    _ltoa_s(static_cast<unsigned long>(sData),pNum,BufSize,10);
    pVec.push_back(pNum);
    delete [] pNum;
    return(pVec);
}



несколько перегрузок. ) Да вот тут еще кое-что. Скажите как можно перегрузить оператор на std::endl?

чтобы можно было писать 

mDataMemo << sFullFileName.c_str() << " is avi file." << std::endl;

и следующая запись уже пойдет в следующий элемент vectora.
PM MAIL   Вверх
zabivator
Дата 10.12.2006, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Levenson, на мой взгляд, лучше не переопределять std::endl( это задница, предупреждаю сразу, глянул я объявление из stl'а б-рррр ).
Лучше определить свой собственный манипулятор потока. Можешь найти сам, я запамятовал, щас в Страуса слазу, шоб вспомнить, как оно делается.

Добавлено @ 21:17 
Код

class vector_increment {};

std::vector<std::string>& operator<<( std::vector<std::string>& v, const vector_increment& )
{
//Тут работаем как нам надо с вектором
return v;
}

--------------------
#include <zabivator>int main( int, char * [] ){   while( Zabivator::жив() ) Zabivator::моск()++;   return 0;}
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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