2

我在 main.cpp 的另一个 .h 和 .cpp 文件中有一个类。

在 main.cpp 中:

#include <iostream>
#include "filestuff.h"
#include "stream.h" <-- right here

int main(int argc, char** args)
{
    if(!args[1])
        return 0;

    u64 filesize = 0;
    get_file_size(args[1], &filesize);
    u8* fd = new u8[filesize];
    read_file(args[1], fd, filesize);

    Stream s = new Stream(fd, filesize, "rb", BigEndian );

    getchar();
    return 0;
}

在 Stream.h

#include <iostream> //just in case?

#if defined(_WIN32) && defined(_MSC_VER)
    typedef __int64 s64;
    typedef unsigned __int64 u64;
#else
    typedef long long int s64;
    typedef unsigned long long int u64;
#endif

typedef unsigned long int u32;
typedef signed long int s32;
typedef unsigned short int u16;
typedef signed short int s16;
typedef unsigned char u8;
typedef signed char s8;

#define LittleEndian 0x1
#define BigEndian 0x2

class Stream
{
public:
    Stream(u8* buffer, u64 length, char* access, int IOType);
private:
    u8* buffer;
    u64 pos;
    u64 len;
};

在 Stream.cpp 中

#include "stream.h"

Stream::Stream(u8* buffer, u64 length, char* access, int IOType)
{
    u8* buf = new u8[length];
    buffer = buf;
}

我如何使用下面的代码来初始化我的类,就像我现在想做的那样main

Stream* s = new Stream(fd, filesize, "rb", BigEndian );
4

5 回答 5

6

真正的错误在#define LittleEndian = 0x1. 删除=.

于 2013-07-23T06:32:47.357 回答
2

你在这里有一个错误:

Stream *s = new Stream(fd, filesize, "rb", BigEndian );
//     ^

运算符new返回一个指向新分配的存储空间的指针。所以s必须是一个指针才能让它工作。

你应该有一个析构函数。您正在分配动态内存new[],您应该在离开之前释放它:

Stream::~Stream()
{
    if ( NULL != buffer )
    {
        delete [] buffer;
    }
}

当您不再需要时s

delete s;

最后一个错误:

#define LittleEndian = 0x1
//                   ^

删除=.

在 C++ 中,使用static const变量是一种更好的做法:

static const int LittleEndian = 0x1;

看看这个:静态常量与#define

编辑: 对于构造函数:

Stream::Stream(u64 iLength, char* iAccess, int iIOType):
    mBuffer( new u8[iLength] )
{
}

// With mBuffer member of the Stream class.
于 2013-07-23T06:30:47.533 回答
0

有两个可能的错误。如果你想要一个指向对象的指针,写

Stream *s = new Stream(fd, filesize, "rb", BigEndian );

如果你想要一个对象本身而不是一个指针,写

Stream s(fd, filesize, "rb", BigEndian );
于 2013-07-23T06:32:40.590 回答
0

如果您使用动态分配,则必须替换

     Stream s = new Stream(fd, filesize, "rb", BigEndian );

经过

      Stream* s = new Stream(fd, filesize, "rb", BigEndian );

所以 s 成为 Stream 对象上的指针。对流类函数的所有调用都应使用:s-> 或 (*s)。

不要忘记删除你的记忆

 delete s;
于 2013-07-23T06:34:10.377 回答
0

到目前为止指出了很多错误。这是另一个:在您的构造函数中,您设置

buffer = buf

这实际上并没有分配给Stream'buffer成员。这分配给构造函数的buffer参数。你很可能想要

this->buffer = buf

也就是说,我不太确定你为什么将缓冲区作为参数,而只是分配一个不同的缓冲区。当您完成代码时,也许它会有意义。

于 2013-07-23T06:39:25.967 回答