1

ジェネリック配列型Tの要素数Nを定義するテンプレートを使用してクラスを定義しました。この配列のインスタンスをメンバーとして持つ別のクラスがあります。setString関数を使用しようとすると、渡す配列は15要素から4要素に任意になります。

// testClassArraySize.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include <istream>
#include <ostream>
using namespace std;

template<class T, int N>
class CArray {
public:
    T arr[N];
    CArray(void) {/*arr=(T *)malloc(sizeof(T)*N);*/
        if (arr == NULL) {
            cout << "allocation error\n";
        }
    }
    ;
    //CArray (int n) {arr=new T [n]; if(arr==NULL){exit(0); cout<<"allocation error\n";}};
    CArray operator=(const T *);
    T operator[](const int i) {
        return arr[i];
    }
    ;
};

template<class T, int N>
CArray<T, N> CArray<T, N>::operator=(const T *srce) {
    size_t x = sizeof(arr);
    size_t y = sizeof(srce);
    for (int j = 0; j < sizeof(arr); j++) {
        if (j > sizeof(srce)) {
            arr[j] = 0;
            break;
        }
        arr[j] = srce[j];
    }
    return *this;
}

class myTestClass {
private:
    CArray<char, 15> myString;
public:
    myTestClass setString(char set[15]) {
        myString = set;
        size_t x = sizeof(set);
        return *this;
    }
    ;
};

int main() {
    myTestClass myObject;
    myObject.setString("helloWorld");
    return 0;
}

誰かがその理由を知っていますか?

4

1 に答える 1

2

これにはいくつかの問題がありますが、おそらく表示されるのは行です

CArray<T, N> CArray<T, N>::operator= (const T *srce)

注:const T* sourceはポインタであるため、sizeof(srce)はポインタのサイズです。32ビットシステムを使用していると思いますか?

sizeofオブジェクトのサイズ(つまり、「ストレージの領域」)を示します。配列の場合、これは配列全体のサイズ(バイト単位)です。sizeof( int[10] ) == sizeof(int) * 10。ポインタはそれ自体がオブジェクトであり、サイズはC ++の実装(OS、コンパイラなど)によって異なります。32ビットシステムでは、通常4バイトです。sizeof( char* )したがって、は4バイトであり、関数に渡した配列の長さではありません。つまりsizeof( (char*)(char[10]) )、10ではなく4バイトです。

表示される可能性のある別の問題(ただし、デバッグ/トレースによってのみ)は、setString(char set[15])に解決されることsetString(char* set)です。したがって、通常は4にx = sizeof(set)解決されます。x = sizeof(char*)

「helloWorld」をsetStringに渡します。これは、15項目のchar配列char*を想定しています。「helloWorld」にはタイプがあるので、これは良い考えではないと思いますchar const[10](に注意してくださいconst)。15文字の配列を取得するための正しい構文はですchar (&set)[15]

次のようなテンプレートメンバー関数を追加すると、これをよりエレガントに行うことができます。

// in class CArray
template < std::size_t length >
CArray& operator= (const T (&srce)[length]);    // note I return a reference, so no copying

このようにして、配列サイズをテンプレート引数として取得します。注:const Tここでは割り当て操作で使用したため、でconstを適用する必要がありますsetString

template < class T, int N >
template < std::size_t srce_length >
CArray < T, N >& CArray < T, N > :: operator= (const T (&srce)[srce_length])
{
    for (int j = 0; j < N; j++) {    // N is the own length
        if (j >= srce_length) {    // note the >= instead of >, and srce_length instead of sizeof
            arr[j] = 0;
            break;
        }
        arr[j] = srce[j];
    }
    return *this;
}
于 2012-10-07T16:37:27.690 に答える