2017-05-18 32 views
0

は、私は、次のサンプルコードを持っている、とコピー代入は、私はしたくない何かをやっている - それは最初の新しいSAMP(6)、そしてZにコピーを構築しています、それが構築された(6)新しいSAMPを破壊します。 = samp(5)の代わりにsamp(5)のデストラクタを呼び出すことで、元々構築されたsamp(5)を破棄し、新しいsamp(6)で置き換えるなどのコンストラクタを変更する方法はありますか? ?操作のコンストラクタの順序を変更しますか?

#include <iostream> 
class samp 
{ 
public: 
    samp(int a) 
    { 
     m_a = a; 
     std::cout << "cons" <<m_a << std::endl; 
    } 
    int m_a; 

    samp(const samp& other) 
    { 
     std::cout << "copy" << m_a << std::endl; 
     m_a = other.m_a; 
    } 
    samp& operator= (const samp& other) 
    { 
     std::cout << "assg" << m_a << std::endl; 
     samp* z =new samp(other.m_a); 
     return *z; 

    } 
    ~samp() 
    { 
     std::cout << "dest" <<m_a<< std::endl; 
    } 
}; 

int main() 
{ 
    samp z(5); 
    z = samp(6); 
    std::cout << z.m_a << std::endl; 
    return 0; 
} 
+1

私はあなたの代わりに、通常の移動assingnmentのこれを行うことから得ようとしているか興味があります。 –

+0

移動割当をしますか?古いオブジェクトには何かがあります。何かをするにはデストラクタが必要で、コピーされないようにする必要があります。 – Carbon

+0

*コピーの割り当ては私がしたくないことをしています* - いいえ、あなたが書いたことをやっています。デフォルトのコピー・アサインメントは、それがしなければならないものとまったく同じです。あなたは何らかの理由で足を踏み入れて引っ越して奇妙なことをすることに決めました。 – PaulMcKenzie

答えて

0

operator=thisポインタが利用可能であるので、あなたのオブジェクトのメンバです。また、割り当てとは、割り当ての対象が変更されることを意味します。あなたのバージョンは新しいオブジェクトを作成していますが、ターゲットだけを残しています。これが何をしたいない場合を参照してください:

samp& operator= (const samp& other) 
{ 
    m_a = other.m_a; 
    return *this; 
} 
+0

いいえ、私はdest5を期待していましたが、これはもう良いアイデアではないかと思います。 – Carbon

+0

「dest5」とは何ですか? – RichN

+0

その中に5とSAMPが破壊されたときに出力(破壊された?) – Carbon

1

たぶん意味をポインタが何をしたいです:

#include <memory> 

// ... 

    auto z = std::make_unique<samp>(5); 
    z = std::make_unique<samp>(6); // dest5 

    std::cout << z->m_a << '\n';  // 6 

あなたがオブジェクト名は、オブジェクトの参照である言語からC++に来ている場合、それはあるかもしれないが代わりに、オブジェクト参照を複製しようとしているのC++値のセマンティクスに慣れるために、より良い:)

+0

おそらく私は、この区別があまり重要ではない機能的な言語で最も時間を費やしました。 – Carbon

関連する問題