Поток C ++, объявление функций и другие вопросы - PullRequest
2 голосов
/ 23 мая 2011

Iobuffer.cpp

#include "Iobuffer.h"

    IOBuffer::IOBuffer (int maxBytes){
    Init (maxBytes);
    }

    IOBuffer & IOBuffer :: operator = (const IOBuffer & buffer){
        if(MaxBytes< buffer.BufferSize) return *this;//fail
        Initialized = buffer.Initialized;
        BufferSize = buffer.BufferSize;
        memcpy(Buffer, buffer.Buffer, buffer.BufferSize);
        NextByte = buffer.NextByte;
        Packing = Packing;
        return *this;
    }

    void IOBuffer::Clear(){
        NextByte = 0;
        Packing = true;
    }

    void IOBuffer::Print(ostream & stream) const{
        stream<<"MaxBytes "<<MaxBytes<<" BufferSize "<<BufferSize;
    }

    int IOBuffer::Init (int maxBytes){
        Initialized = false;
        if (maxBytes < 0) maxBytes = 0;
        MaxBytes = maxBytes;
        Buffer = new char[MaxBytes];
        BufferSize = 0;
        Clear ();
        return 1;
    }

    int IOBuffer::DRead(istream & stream, int recref){
        stream.seekp(recref, ios::beg);
        if(stream.tellp() != recref) return -1;
        return Write(stream);
    }

    static const char * headerStr = "IOBuffer";
    static const int headerSize = strlen(headerStr);

    int IOBuffer::ReadHeader(istream & stream){
        char str[9];
        stream.seekg(0, ios::beg);
        stream.read(str, headerSize);
        if(!stream.good()) return -1;
        if(strncmp(str,headerStr, headerSize)==0) return headerSize;
        else return -1;
}

    int IOBuffer::WriteHeader (ostream & stream) const{
        stream.seekp(0, ios::beg);
        stream.write(headerStr, headerSize);
        if(!stream.good()) return -1;
        return headerSize;
}

это сопровождается Iobuffer.h

#include <cstring>
#include <iostream>
    class IOBuffer{
    public:
        IOBuffer (int maxBytes = 1000);
        IOBuffer & operator = (const IOBuffer &);
        virtual void Clear ();
        virtual int Pack (const void * field, int size = -1) = 0;
        virtual int Unpack (void * field, int maxbytes = -1) = 0;
        virtual void Print(ostream &) const;
        int Init (int maxBytes);
        virtual int Read (istream & x) = 0;
        virtual int Write (ostream & x) const = 0;
        virtual int DRead(istream &, int recref);
        virtual int DWrite(ostream &, int recref) const;
        virtual int ReadHeader (istream &);
        virtual int WriteHeader (ostream *);
    protected:
        int Initialized;
        char * Buffer;
        int BufferSize;
        int MaxBytes;
        int NextByte;
        int Packing;
    };

Это задание из моего курса по файловым системам. В Iobuffer.h, #include <iostream> есть, потому что я предполагал, что это исправит "ostream" или "istream" "не было объявлено" ошибки, которые я получаю от виртуальной; Прототипы функций Печать, Чтение, Запись, DRead, DWrite, ReadHeader и WriteHeader. Это единственные ошибки из этого файла. Ошибки в файле .cpp несколько коррелируют, я получаю те же ошибки «istream» и «ostream не был объявлен». Любая помощь очень ценится, дайте мне знать, если потребуется дополнительная информация.

-Macaire Обновление, предложение сэра Чарльзворта сокращает ошибки в геометрической прогрессии. В заголовочном файле для прототипа виртуальной функции WriteHeader генерируется ошибка «Кандидат: виртуальный int IOBuffer :: WriteHeader (std :: ostream )». Остальные 5 ошибок находятся в файле .cpp, три из них из определения DRead (по одной в каждой строке). Первая строка гласит

‘struct std::basic_istream<char, std::char_traits<char> >’ has no member named ‘seekp’

С другой стороны, почему это форматирование такое иностранное? Я посмотрел ostream здесь на cplusplus.com, и я полагаю, что это может быть потому, что я использую целое число в качестве смещения поиска. Продолжая, следующая строка говорит

‘struct std::basic_istream<char, std::char_traits<char> >’ has no member named ‘tellp’

В ответном выражении говорится что-то очень любопытное,

no matching function for call to ‘IOBuffer::Write(std::basic_istream<char, std::char_traits<char> >&)’

Последняя ошибка - прототип для

‘int IOBuffer::WriteHeader(std::ostream&) const’ does not match any in class ‘IOBuffer’

и да, это было 5, а не 6 ошибок.

Ответы [ 2 ]

6 голосов
/ 23 мая 2011

Большинство имен в стандартной библиотеке находятся в пространстве имен std. Поэтому обычной практикой является их полная квалификация при использовании (std::ostream вместо ostream и т. Д.).

Менее рекомендуемый подход - объявить using namespace std;, который перетянет все пространство имен std в любую область, в которой вы сейчас находитесь (чтобы избавить вас от необходимости писать std:: каждый раз). Обратите внимание, что крайне плохая практика - иметь using namespace ... объявления в заголовочных файлах. Они должны быть зарезервированы только для исходных файлов.

UPDATE

Большинство ваших новых сообщений об ошибках связано с тем, что вы перепутали istream и ostream. istream имеет функцию с именем seekg, а не seekp, например.

2 голосов
/ 23 мая 2011

Ваши последние две ошибки const проблемы.

Вы получаете вторую ошибку, потому что вы вызываете Write, который является константной функцией от DRead,которая является неконстантной функцией.Вы, вероятно, могли бы удалить const из объявления для Write, но убедитесь, что вы делаете то же самое во всех классах, производных от него, тоже!

Вы получаете последнюю ошибку, потому что IOBuffer.cppиспользует определение const - int IOBuffer::WriteHeader (ostream & stream) const - но IOBuffer.h использует неконстантное объявление - virtual int WriteHeader (ostream *);.Вам нужно выбрать одно или другое (то есть оба должны иметь const в конце или ни одного).

Вы не знаете, как использовать const?Есть ли какая-то конкретная причина, по которой вы объявляете свои функции записи как const, а функции чтения как не-const?Обычно все наоборот ...

Для получения дополнительной информации, прочитайте эту статью о правильности const и, в частности, вопрос "Что такое функция-член const?".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...