0

コンストラクターで動的配列を作成し、コンストラクターに渡された引数を配列のメンバーに割り当てたいと思います。

私がヘッダーに持っているものの簡略化されたバージョン:

//in classes.h
#ifndef classes_h
#define classes_h
#include <iostream>
class Base{
        int a,*var;
public:
    Base();
    Base(int);
    ~Base();
    int func(int);
};
#endif

そして*.cppで:

//In classes.cpp
#incldue "classes.h"
Base::Base(int a){
    var=new int[2];
    var[0]=a;
    var[1]=func(a);
}
Base::~Base(){
        delete var;
}
int Base::func(int b){
    return b++;
}
int main(){
Base obj(1);
return 0;}

その配列を何らかの方法で変更する関数に渡すことができる必要がありますが、実際には配列の定義にさらに問題があります...

コンパイラやリンカからエラーは発生しませんが、デバッグすることで、問題は配列の作成にあるという結論に達しました。

ポインター、動的配列、クラスの基本を3回(またはそれ以上)調べましたが、役に立ちませんでした。私がやろうとしていることが実際に可能であることを望んでいます。そうでない場合、最も近いものは何ですか?

4

3 に答える 3

1

が原因で未定義の動作が発生しています

var=new int[2];

で解放されている

delete var;

の代わりにdelete[] var;

代わりに使用する必要がありますstd::vector<int>。そうすれば、デストラクタ/コピーコンストラクタ/代入演算子について心配する必要はありません。

また、注意してください

int Base::func(int b){
    return b++;
}

の前の値が返されるため、基本的には何もしませんb。意味return b+1ですか?

于 2012-11-01T06:47:50.227 に答える
1

2つの問題があります。

  1. あなたは三つのルールに従っていません。
  2. 未定義動作があります。

詳細:

delete var;

する必要があります:

delete []var;

newdeleterequireとrequires 、mismtachは未定義動作になりますnew[]delete []

提案:

動的cスタイル配列の代わりにstd::vectorまたはを使用する必要があります。std::arrayそれはあなたにすべての努力を節約し、彼らはエラーを起こしにくいです。

于 2012-11-01T06:47:57.680 に答える
0

この例のベクトルが気に入らない場合は、std :: pairを使用できますが、ベクトルが最適です。私は何ヶ月もアレイを使用していません。

于 2012-11-01T09:39:41.123 に答える