其他头文件中的类?

时间:2013-07-23 06:27:29

标签: c++ class

我在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 );

5 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分: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;

看看这个:static const vs #define

编辑:  对于构造函数:

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

// With mBuffer member of the Stream class.

答案 2 :(得分:0)

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

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

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

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

答案 3 :(得分:0)

如果您使用动态分配,请在主页中

你必须替换

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

通过

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

所以s成为Stream对象的指针。 所有对流类功能的调用都应该用:s-&gt;或(* s)。

并且不要忘记用

删除你的记忆
 delete s;

答案 4 :(得分:0)

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

buffer = buf

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

buffer

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