0

コードにスマート ポインターを実装しようとしています。Point を shared_ptr に変換するクラスを作成し、shared_ptr の印刷関数を追加しました。私のメインでは、Shape 型の shared_ptr の配列を作成します。Points を配列に割り当てると、共有コンストラクタ/デストラクタではなく、生のコンストラクタ/デストラクタのみが表示されます。このコードは正しいですか?

ありがとう。

#include "Point_H.hpp"
#include "Shape_H.hpp"
#include "Array_H.hpp"
#include "boost/shared_ptr.hpp"

using namespace CLARK::Containers;
using namespace CLARK::CAD;

class P1
{
private:
    boost::shared_ptr<Point> pp;

public:
    P1(boost::shared_ptr<Point> value) : pp(value) { cout << "P1 constructor call (default)" << endl; }
    virtual ~P1() { cout << "P1 destructor call" << endl; }
    void print() const { cout << "Point: " << *pp << endl; }
};

void Print()
{       
        boost::shared_ptr<Point> myPoint (new Point);
        {
            P1 point1(myPoint);
            point1.print();
        }           
}    

int main()
{   

    // Typedef for a shared pointer to shape
    // a typedef for an array with shapes stored as shared pointers.
    typedef boost::shared_ptr<Shape> ShapePtr;
    typedef Array<ShapePtr> ShapeArray;

    ShapeArray my_ShapeArray(3);

    ShapePtr my_Point (new Point(3.1459, 3.1459));

    my_ShapeArray[0] = my_Point;

    my_ShapeArray[0]->Print();

    return 0;    
}

出力は次のようになります (コンストラクター/デストラクター ステートメントは、このソース ファイルのコードではなく、Point/Shape/Array クラス自体からのものです。

配列コンストラクターの呼び出し

シェイプ コンストラクターの呼び出し (既定)

ポイントコンストラクター呼び出し (3.1459,3.1459) ID:41

ポイントデストラクタ呼び出し

形状デストラクタ呼び出し

配列デストラクタ呼び出し

shared_ptr コンストラクター/デストラクター ステートメントが表示されることを期待していました。問題は P1 コードにありますか、それともメインまたは他の場所での実装にありますか?

ありがとう!

4

2 に答える 2

0

関数内のコードから1ビットも呼び出していませんmain...インスタンス化P1することも、スタンドアロン関数Printを呼び出すこともありません。では、どのようにしてロギングステートメントを呼び出すことができるでしょうか。

于 2012-10-05T22:05:22.633 に答える
0

あなたが呼んでいる

my_ShapeArray[0]->Print();

これは Shape のメンバー関数でなければなりません。

あなたは電話していません

Print();

指定されたコードで定義する関数で、P1 クラスを使用する関数です。

于 2012-10-05T21:47:32.830 に答える