Я пытаюсь реализовать умные указатели в моем коде. Я создал класс для преобразования Point в shared_ptr и добавил функцию печати для shared_ptr. В основном я создаю массив shared_ptr типа Shape. Когда я назначаю точки массиву, я вижу только необработанные конструкторы / деструкторы, а не общий конструктор / деструкторы. Этот код правильный?
Благодарю.
#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;
}
Вывод выглядит так, как показано ниже (операторы constructor / destructor взяты из самих классов Point / Shape / Array, а не из кода в этом исходном файле.
Вызов конструктора массива
Вызов конструктора формы (по умолчанию)
Вызов конструктора точек (3.1459,3.1459) ID: 41
Точка деструктора вызова
Вызов деструктора формы
Вызов массива деструкторов
Я ожидал увидеть операторы shared_ptr конструктор / деструктор. Моя проблема в коде P1 или в моей реализации в основном или в другом месте?
Спасибо!
Ты звонишь
my_ShapeArray[0]->Print();
которая должна быть функцией-членом Shape.
Вы не звоните
Print();
функция, которую вы определяете в данном коде и которая использует класс P1.
Вы не вызываете ни одного бита из своего кода в main
функция … Вы никогда не создаете экземпляр P1
вы никогда не вызываете отдельную функцию Print
Так как же может быть вызван любой из ваших операторов логирования?