0

以下のコードがあり、Templeオブジェクトをスマート ポインターでラップしました。概念は理解できましたが、理解できなかったのは、保持されたオブジェクトのデストラクタがいつ呼び出されるかです。

とはいえ、~mySmartPointer を実装していないため、テンプレート デストラクタが呼び出されます。

出力

テンプルコンストラクター

ポインター アクセス演算子の呼び出し

-- ウェルカムテンプル

逆参照演算子の呼び出し

-- ウェルカムテンプル

テンプルデストラクタ

デストラクタが呼び出される

コード

#include <iostream>
using namespace std;

template <typename T>
class mySmartPointer 
{
private:
    T *_object;    
public: 
    explicit mySmartPointer(T * newObject) {
       _object = newObject;
    };
    ~mySmartPointer() { cout <<"Destructor is Invoked "<<endl;}; 

    T operator *() {
        cout  <<" Invoking De-referencing Operator "<<endl;
        return * _object;
    };

    T * operator ->() {
        cout <<"Invoking pointer access operator "<<endl;
        return _object;
    };
};

class Temple
{
private:
    int x,y;
public:
    void printWelcome() {
        cout <<"-- Welcome Temple "<<endl;
    }
    Temple() {
        cout <<"Temple Constructor"<<endl;
    }
    ~Temple() {
        cout <<"Temple Destructor "<<endl;
    }
};

int main(int argc, char ** argv) {
    mySmartPointer<Temple> t (new Temple);
    t->printWelcome();      
    (*t).printWelcome();
}
4

3 に答える 3

1

これが混乱の原因となっているコードです。

  T operator *() 
  {
      cout  <<" Invoking De-referencing Operator "<<endl;
      return * _object;
  };

このコードを呼び出すと、Templeのコピーが作成されます。このコピーは自動的に破棄されます。

これに変更します:

  T& operator *() 
  {
      cout  <<" Invoking De-referencing Operator "<<endl;
      return * _object;
  };
于 2013-01-24T15:48:26.380 に答える