C++流、函数声明和其他问题



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尚未声明"错误。任何帮助都非常感谢,如果需要进一步的细节,请告诉我。

-马凯尔更新,查尔斯沃思爵士的建议成倍减少错误。在 WriteHead 的虚拟函数原型的头文件中,生成了"候选者是:虚拟 int IOBuffer::WriteHeader(std::ostream)"错误。 其余 5 个错误在 .cpp 文件中,其中 3 个来自 DRead 的定义(每行一个)。第一行说

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

附带说明一下,为什么这种格式如此陌生?我在 cplusplus.com 这里查找了ostream,我想这可能是因为我使用整数作为我的搜索偏移量。继续,以下行说

‘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 错误。

标准库中的大多数名称都位于命名空间std 中。 所以通常的做法只是在使用它们时完全限定它们(std::ostream而不是ostream,等等)。

不太推荐的方法是声明 using namespace std; ,这会将整个 std 命名空间拉入您当前所处的任何范围(以节省每次编写std::的麻烦)。 请注意,在头文件中具有using namespace ...声明被认为是极其糟糕的做法。 这些应仅保留给源文件。

更新

大多数新错误消息是因为您将istreamostream混淆了。 例如,istream有一个名为seekg的函数,而不是seekp

你的最后两个错误是const问题。

收到倒数第二个错误,因为您正在从 DRead 调用 Write ,这是一个常量函数,这是一个非常量函数。您可能可以从 Write 的声明中删除const,但请确保在派生的所有类中也执行相同的操作!

您得到最后一个错误,因为IOBuffer.cpp使用常量定义(int IOBuffer::WriteHeader (ostream & stream) const),但IOBuffer.h使用非常量声明(virtual int WriteHeader (ostream *);)。您需要选择一个或另一个(即它们要么都需要在末尾有const,要么两者都不需要)。

您对如何使用const感到困惑吗?你有什么特别的理由宣布你的写作功能是const,你的阅读功能是非const的?通常情况正好相反...

有关更多信息,请查看这篇关于常量正确性的文章,特别是问题"什么是常量成员函数?

相关内容

  • 没有找到相关文章

最新更新