1
class WavFile
{
    std::vector<short> SoundData;

public:

    std::vector<short> getSoundData()
    {
        return SoundData;
    }
}

通常は使用しますfread( &SoundData[0], 1, 1337, SomeFile );

しかし、クラス内でベクトルを使用しているため、次の問題が発生しています。

  • クラス外でベクトルサイズを設定する方法を知っている。

  • freadまた、データをベクトル内に配置するための引数としてメソッドを使用する方法がわかりません。

4

3 に答える 3

2

あなたがやろうとしていることは一般的に悪いことです。それにはいくつかの主要なポイントがあります:

クラスにカプセル化する場合vectorでも、公開されていれば、外部から通常どおり操作できます。

WavFile WF;
void* Ptr = WF.SoundData.data();
// void* Ptr = &WF.SoundData[0]; - C++03

ベクトルへの呼び出しの一部をラップすることもできます.resize()。次に例を示します。

void WavFile::resize(vector::size_type new_size) {
    SoundData.resize(new_size);
}

void* WavFile::getRawPtr () {
    return SoundData.data();
    // return (&SoundData[0]); - C++03
}

を使用している場合はstd::vector、対応するC++読み取り関数も使用する必要があります。メモリ配列として扱うことは有効ですが、たとえばvector、それを使用するためのより良い方法があります。fstream

カプセル化する場合vector(またはstd一般的なコンテナー)は、値で返さないでください。これにより、すべての要素がコピーされます。代わりに、const-referenceをcontainerに返します。さらに良いのは、rangeを返します。

于 2012-12-01T13:14:43.387 に答える
1
  • クラス外でベクトルサイズを設定する方法を知っている。

サイズをベクターのコンストラクターに渡すベクターを作成できます。

  • また、データをベクトル内に配置するためのfreadの引数としてメソッドを使用する方法がわかりません。

freadそもそもなぜ使っているのですか?どうしてfstream

また、サイズを渡すベクトルを初期化する&v[0]と、c-array(つまり)として宣言された場合と同じように使用できますfloat v[const_size]

于 2012-12-01T13:14:26.157 に答える
0

freadの引数としてvectorを使用することはできません。データを読み込むためのバッファとしてメモリのブロック(short buffer [SIZE])を割り当ててから、データを要素ごとに挿入してバッファからベクトル化する必要があります。

freadはC++で許可されていますが、fstreamなどのネイティブC++の方法でファイルを読み取ることをお勧めします。

于 2012-12-01T13:17:48.100 に答える