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

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 constvariableを使用することをお勧めします。

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.
于 2013-07-23T06:30:47.533 に答える
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 に答える