Как наследоваться станд.:: ostream?

Причина: GetRow возвращает значение типа int. Таким образом, вы не можете установить это свойство, например IsVisible

] Вы можете установить rowHeight как 0, если хотите скрыть конкретную строку.

 var row = myGrid.RowDefinitions[index];
 row.Height = 0;
35
задан Michael 21 April 2009 в 12:37
поделиться

3 ответа

Это не простой вопрос, к сожалению. Классы, которые вы должны получить, это классы basic_ , такие как basic_ostream . Тем не менее, вывод из потока может быть не тем, что вам нужно, вы можете вместо этого извлечь производный из буфера потока, а затем использовать этот класс для создания экземпляра существующего класса потока.

Вся область сложна, но есть отличная книга об этом Стандартные потоки и языки IOS C ++ , на которые я предлагаю вам взглянуть, прежде чем идти дальше.

24
ответ дан 27 November 2019 в 06:48
поделиться

Композиция, а не наследование. Ваш класс содержит, «оборачивает» ostream & и передает его (после вызова foo ()).

0
ответ дан 27 November 2019 в 06:48
поделиться

Я не знаю, правильное ли это решение, но я унаследовал от std :: ostream таким образом. Он использует буфер, унаследованный от std :: basic_streambuf, и получает 64 символа за раз (или меньше, если он сброшен) и отправляет их универсальному методу putChars (), где выполняется фактическая обработка данных. Он также демонстрирует, как предоставлять данные пользователя.

Живой пример

#include <streambuf>
#include <ostream>
#include <iostream>

//#define DEBUG

class MyData
{
    //example data class, not used
};

class MyBuffer : public std::basic_streambuf<char, std::char_traits<char> >
{

public:

    inline MyBuffer(MyData data) :
    data(data)
    {
        setp(buf, buf + BUF_SIZE);
    }

protected:

    // This is called when buffer becomes full. If
    // buffer is not used, then this is called every
    // time when characters are put to stream.
    inline virtual int overflow(int c = Traits::eof())
    {
#ifdef DEBUG
        std::cout << "(over)";
#endif
        // Handle output
        putChars(pbase(), pptr());
        if (c != Traits::eof()) {
            char c2 = c;
            // Handle the one character that didn't fit to buffer
            putChars(&c2, &c2 + 1);
        }
        // This tells that buffer is empty again
        setp(buf, buf + BUF_SIZE);

        return c;
    }

    // This function is called when stream is flushed,
    // for example when std::endl is put to stream.
    inline virtual int sync(void)
    {
        // Handle output
        putChars(pbase(), pptr());
        // This tells that buffer is empty again
        setp(buf, buf + BUF_SIZE);
        return 0;
    }

private:

    // For EOF detection
    typedef std::char_traits<char> Traits;

    // Work in buffer mode. It is also possible to work without buffer.
    static const size_t BUF_SIZE = 64;
    char buf[BUF_SIZE];

    // This is the example userdata
    MyData data;

    // In this function, the characters are parsed.
    inline void putChars(const char* begin, const char* end){
#ifdef DEBUG
        std::cout << "(putChars(" << static_cast<const void*>(begin) <<
            "," << static_cast<const void*>(end) << "))";
#endif
        //just print to stdout for now
        for (const char* c = begin; c < end; c++){
            std::cout << *c;
        }
    }

};

class MyOStream : public std::basic_ostream< char, std::char_traits< char > >
{

public:

    inline MyOStream(MyData data) :
    std::basic_ostream< char, std::char_traits< char > >(&buf),
    buf(data)
    {
    }

private:

    MyBuffer buf;

};

int main(void)
{
    MyData data;
    MyOStream o(data);

    for (int i = 0; i < 8; i++)
        o << "hello world! ";

    o << std::endl;

    return 0;
}
5
ответ дан 27 November 2019 в 06:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: