1

これはどう考えても危険ですか?他の方法については知りませんが、非常に疑わしいようです。

class cA
{
public:
    cA(){}
    ~cA(){}
    int a;
//say class have tons of members..
};


int _tmain( int argc, _TCHAR* argv[] )
{
    cA obj;
    cA *ptr = new cA;
    *ptr = obj;
    //ofc there is a 'delete ptr;' after
}

C++ で正しく覚えていれば、これは のオブジェクトcAが作成され、ptrそれを指すことを意味します。これを実行して、長寿命のコンテナー ( vector<cA*>) に挿入する必要があります。

obj の内容をスタックからヒープにコピーすることは有効ですか?

可能な解決策を編集しますか?

class cA
{
public:
    cA(){}
    ~cA(){}
    int a;
    void Copy( cA & ref )
    {
        a = ref.a;
    }
};


int _tmain( int argc, _TCHAR* argv[] )
{
    cA obj;
    cA *ptr = new cA;
    ptr->Copy( obj );
4

3 に答える 3

2

このフォームの代わりに:

cA obj;
cA *ptr = new cA;
ptr->Copy( obj );

なぜこのフォームではないのですか?

cA obj;
cA *ptr = new cA(ob);  

コピー コンストラクターは次のようになります。代入演算子も必要です。

class cA
{
public:
    cA(){}
    CA(const cA& ref)
    {
        a = ref.a;
    }
    ~cA(){}

    cA& operator=(const cA& p) {
        if (this != &p) {  // make sure not same object
            a = p.a;
        }
        return *this;    // Return ref for multiple assignment
    }

    int a;
};

いや、あなたが以前していたことは危険ではありませんでしたが、理解するのが少し難しかっただけかもしれません。

于 2013-06-04T02:00:22.937 に答える
1

大丈夫だよ。しかし、それは依存します。

クラスが単純な古いデータ型である場合 (たとえば、すべて単純な非ポインターまたは非リソース管理メンバーの場合) は、コピー コンストラクターまたは代入演算子を実装する必要はありません。たとえば、cA各メンバーの値を単純にコピーする必要がある一連の float、int、および bool を保持している場合、自動コンパイラ生成コピー コンストラクターは問題なく動作します。

ただし、内部リソースへのポインターを保持している場合は、基になるリソースのコピー (「ディープ」コピー) を適切に処理するコピー コンストラクターと代入演算子を実装する必要があります。

継承を計画している場合は、仮想デストラクタのみが必要ですcA。そうしないと、理由もなく、クラスの各インスタンスに vtable ポインターの膨張を追加するだけです。サブクラス化するつもりがなく、C++11 を使用している場合は、クラスを として設定できます。finalこれは、誰かがとにかくサブクラス化しようとしても、仮想デストラクタの問題を心配する必要がないことを意味しますcA(コンパイル エラーが発生します)。 .

privateさらに、新しいクラスを作成するときのように、コピー コンストラクターと代入演算子を自動的に宣言することを実践するのに役立ちます。次に、コピー割り当てを実行しようとするとコンパイラ エラーが発生します。その時点で宣言を削除するだけで、コンパイラが自動バージョンを生成できるようになります。このようにして、クラスがどのように使用されているかをもう少し制御してフィードバックすることができ、後で驚くような事態を避けることができます。

于 2013-06-04T01:46:17.747 に答える