0

次のように定義されたクラスがあります。

class dimension{
public:
    dimension();
    const char* getname();
    long ing getlength();
    void setname(const char* text)
    void setlength(long int size)
    virtual ~dimension();
private:
    const char* name;
    long int length;
}

関数に関するエラーが発生setnameしてsetlengthおり、重要であるため、それらの定義は次のとおりです。

void dimension::setname(const char* text)
{
    dimension::name = text;
}
void dimension::setlength(long int size)
{
    dimension::length = size;    
}

現在、ファイルからクラス次元のオブジェクトの配列を読み取るために使用している2つの関数があります。それらの定義は次のとおりです。

void read_dimension(dimension** dims, int*ndims, const char* text, long int size)
{
    int i;
    *dims = new dimension[*ndims];
    for(i=0; i<ndims; i++)
    {
        (*dims)[i].setname(text)   
        (*dims)[i].setlength(size) 
    }
}

void read_file(char *path, dimension** dims, int *ndims)
{
    //do-- open file and read the variables ndims, text and size from it.
    read_dimension(dims, ndims, text, size);
    //do-- print name and length of all elements of (*dims).
}

今、私はこれらの関数をメインで次のように呼び出しています

int main()
{
    //do-- get file path
    dimesnion* gdims;
    int num_dims;
    read_file(path, &gdims, &num_dims);
    //do-- print name and length of each element of gdims.
    return 0;
}

コードを実行すると"name"、関数から出力された変数は異なりますが、変数は同じです。なぜこれが起こっているのかわかりません。誰かが助けてくれたらうれしいです。read_dimension()main()"length"

4

1 に答える 1

0

text が read_dimension 関数のローカル変数であり、おそらく char の配列であることは間違いありません。既に述べたように、dimension::setname はあるポインターを別のポインターに割り当てます。read_dimension 関数のテキスト変数が範囲外になるとどうなりますか? それは死にます...今、次元クラスのポインタは「どこにも」を指していません。const char * を文字列リテラルとして、または文字配列内の文字へのポインタとして使用することを好みます。文字列を保存する場合は、おそらく strcpy を介してコピーしますが、もちろん、十分なスペースを持つ char のコピー先配列が存在する必要があります。

このコードの目的は何ですか: ディメンション::名前 = テキスト; および次元::長さ=サイズ; setname および setlength メソッドで? 次元クラスの範囲ですね。

于 2013-06-04T07:41:52.047 に答える