0

いくつかの関数を持つテンプレート/クラスを作成しようとしていますが、かなり初心者の問題のように見えます。簡単な挿入機能と値表示機能がありますが、値を表示しようとすると常にメモリアドレスのように見えますが(わかりません)、保存されている値を受け取りたいです(これに特定の例、int 2)。それを値に逆参照する方法がわかりません。または、完全に混乱しているだけなのかどうかはわかりません。ベクトルがより良い代替手段であることは知っていますが、この実装では配列を使用する必要があります。正直なところ、コードと何が起こっているのかをより完全に理解したいと思います。このタスクを実行する方法についての助けをいただければ幸いです。

出力例(毎回同じ方法でプログラムを実行):003358C0

001A58C0

007158C0

コード:

#include <iostream>
using namespace std;

template <typename Comparable>
class Collection
{
public: Collection() {
    currentSize = 0;
    count = 0;
    }
    Comparable * values;
    int currentSize; // internal counter for the number of elements stored
    void insert(Comparable value) {
        currentSize++; 
                // temparray below is used as a way to increase the size of the 
                // values array each time the insert function is called
        Comparable * temparray = new Comparable[currentSize];
        memcpy(temparray,values,sizeof values);

                // Not sure if the commented section below is necessary, 
                // but either way it doesn't run the way I intended

        temparray[currentSize/* * (sizeof Comparable) */] = value; 
        values = temparray;
    }
    void displayValues() {
        for (int i = 0; i < currentSize; i++) {
            cout << values[i] << endl;
        }
    }
};

int main()
{
Collection<int> test;
int inserter = 2;
test.insert(inserter);
test.displayValues();
cin.get();
    return 0;
}
4

3 に答える 3

2

この行は間違っています:

memcpy(temparray,values,sizeof values);

この行が最初に実行されるとき、valuesポインターは初期化されていないため、未定義の動作が発生します。さらに、使用sizeof valuesすると常にポインタのサイズが得られるため、使用は間違っています。

別の問題:

temparray[currentSize] = value; 

currentSizeにアイテムを割り当てただけなので、これは未定義の動作も引き起こします。temparrayそのため、にアクセスできるのはインデックスのみ0ですcurrentSize-1

于 2012-09-10T14:59:26.473 に答える
2

まあ、あなたが主張するなら、あなたはあなた自身の限定されたバージョンのを書いてデバッグすることができますstd::vector

まず、memcpy初期化されていないポインタからではありません。コンストラクターでに設定valuesします。new Comparable[0]

次に、memcpy正しいバイト数:(currentSize-1)*sizeof(Comparable)

第三に、まったくしないmemcpyでください。Comparableこれは、型がすべてバイトごとにコピーできることを前提としています。これは、C++の重大な制限です。その代わり:

編集:に変更されuninitialized_copyましたcopy

std::copy(values, values + currentSize - 1, temparray);

第4に、使用されなくなった古いアレイを削除します。

delete [] values;

第5に、コードが挿入をほとんど行わない場合を除いて、配列を複数拡張します。std::vector通常、サイズは1.5倍になります。

currentSize第六に、サイズが変わるまでインクリメントしないでください。これにより、これらすべてがに変更currentSize-1されcurrentSize、煩わしさが大幅に軽減されます。<g>

第7に、サイズの配列にはからまでのNインデックスがあるため、新しい配列の最上位要素はであり、ではありません。0N-1currentSize - 1currentSize

第八に、私は言及しました、あなたは本当に使うべきstd::vectorです。

于 2012-09-10T15:30:26.813 に答える
0

配列アクセスにもエラーがあります。

temparray[currentSize/* * (sizeof Comparable) */] = value;

配列はインデックスゼロから始まることに注意してください。したがって、長さが1の配列の場合、temparray [0]=valueを設定します。挿入関数の先頭でcurrentSizeをインクリメントするため、代わりにこれを行う必要があります。

temparray[currentSize-1] = value;
于 2012-09-10T15:03:21.730 に答える