Проблема в наследнике vector (STL)
От: izverg США  
Дата: 27.05.03 09:26
Оценка:
Здравствуйте.

Имеется следующий код (использую mingw32 (gcc 3.0.2)):

typedef unsigned char byte;

class Message : public std::vector<byte>
{
public:
    typedef void* dataT;
    typedef unsigned long sizeT;
    
    Message(){};
    Message(const Message& msg){ *this = msg; }
    virtual ~Message(){};
    
    void pop_size(int size)
    {
        if (this->size() >= (unsigned int)size)
         erase(begin(), begin()+size);
    }
    
    Message& add(const dataT p, sizeT s)
    {
        insert(end(), (byte*)p, (byte*)p+s);
        return *this;
    }
    
    Message& operator <<(int iv)
    {
        add(&iv,sizeof(int));
        return *this;
    }

    Message& operator <<(char c)
    {
        add(&c,sizeof(char));
        return *this;
    }
    
    Message& operator <<(const char* str)
    {
        int len = (int) strlen(str) + 1;
        operator <<(len);
        add((dataT)str,len);
        return *this;
    }
    
    Message& operator >>(string& str)
    {
        if (size() <= sizeof(int)) return *this;
        int len;
        operator >>(len);
        str = (char*)getdata();
        pop_size(len);
        return *this;
    }
    
    Message& operator >>(int& iv)
    {
        if ( size() < sizeof(int) ) return *this;
        iv = *(int*)getdata();
        pop_size(sizeof(int));
        return *this;
    }

    Message& operator >>(char& c)
    {
        if ( size() < sizeof(char) ) return *this;
        c = *(char*)getdata();
        pop_size(sizeof(char));
        return *this;
    }

    dataT getdata() const { return (dataT)begin(); }
};


При компиляции получаю ошибку в реализации метода getdata. Вот такую:

mmm.cpp: In member function `void* Message::getdata() const':
mmm.cpp:77: cannot convert
`std::vector<_Tp, _Alloc>::begin() const [with _Tp = byte, _Alloc = std::allocator<byte>]()'

from type

`__gnu_cxx::__normal_iterator<const byte*, std::vector<byte, std::allocator<byte> > >' to type `void*'


Как мне в getdata получить константный void* на первый элемент вектора (подчистку вектора делаю методом pop_size) ?

Заранее спасибо. Буду благодарен если кто-либо напишет мне в аську на 53898432/
Re: Проблема в наследнике vector (STL)
От: Lorenzo_LAMAS  
Дата: 27.05.03 09:38
Оценка:
Никто не требует (и это проявилось в твоем случае), чтобы std::vector<char>::iterator был простым указателем на char. А потому твое приведение не сработало.
Сделать можно по-разному, например:
static_cast<void *>(&*begin());//0
static_cast<void *>(&front());//1
&operator[](0);//2
Of course, the code must be complete enough to compile and link.
Re: Проблема в наследнике vector (STL)
От: MaximE Великобритания  
Дата: 27.05.03 10:10
Оценка:
Здравствуйте, izverg, Вы писали:

А зачем вообще может понадобиться наследоваться от vector<>, да еще публично? Предполагается использование класса Message и как обычного vector<>?
Re[2]: Проблема в наследнике vector (STL)
От: izverg США  
Дата: 27.05.03 10:52
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Здравствуйте, izverg, Вы писали:


ME>А зачем вообще может понадобиться наследоваться от vector<>, да еще публично? Предполагается использование класса Message и как обычного vector<>?


именно
Re[2]: Проблема в наследнике vector (STL)
От: izverg США  
Дата: 27.05.03 10:57
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>Никто не требует (и это проявилось в твоем случае), чтобы std::vector<char>::iterator был простым указателем на char. А потому твое приведение не сработало.

L_L>Сделать можно по-разному, например:
L_L>
L_L>static_cast<void *>(&*begin());//0
L_L>static_cast<void *>(&front());//1
L_L>&operator[](0);//2
L_L>


Воспользовался варинтом номер 3. В принципе все работает как надо. Большое спасибо. Интересно вот что

int main()
{
string aaa;
Message bb;
bb << "Хер моржовый.";
bb >> aaa;
printf("%s\n", (char *)aaa);
}

вот так печатается. а почему вариант с printf("%s\n", bb.getdata());
не прокатывает ? потомучто он указывает не на строку а на длинну которая лежит на вершине вектора чтоли ? с другой стороны первая ложиться в вектор len, а не строка. разобраться хочется.
Re[3]: Проблема в наследнике vector (STL)
От: MaximE Великобритания  
Дата: 27.05.03 11:50
Оценка: 3 (1)
Здравствуйте, izverg, Вы писали:

ME>>А зачем вообще может понадобиться наследоваться от vector<>, да еще публично? Предполагается использование класса Message и как обычного vector<>?


I>именно


Очень странно...

В этом случае, на мой взгляд, логичнее было бы применить паттерн адаптер, т.е. на время предоставлять вектору другой интерфейс:

class message_adapter
{
public:
    message_adapter(vector<byte>& v) : v_(v) {}

public:
    // твои дополнительные методы

private:
    vector<byte>& v_;
};


В этом случае также не теряешь родных конструторов vector<>'а.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.