Правильный способ иметь конструктор преобразования в C ++ - через ссылку на констант:
Rectangle(const TwoPoint& i)
Это также означает, что вы можете передать временный параметр:
Rectangle* r = new Rectangle( TwoPoint(0,8) ); //dynamic storage
или
Rectangle r( TwoPoint(0,8) ); //automatic storage
Это также будет работать с передачей по значению, но это стандартный способ сделать это.
То же самое относится к Shape
классу:
Shape(const T& initval) //conversion constructor
и
Shape<TwoPoint>* solidShape = new Shape<TwoPoint>( TwoPoint(0,5) ); //dynamic storage
или
Shape<TwoPoint> solidShape( TwoPoint(0,5) ); //automatic storage
В C ++ new
возвращает указатель. Но ваши конструкторы преобразования принимают объекты (не указатели на объекты) по ссылке или значению. Поэтому вам нужен объект, переданный в качестве параметра, а не указатели.
Если эти двое являются учениками:
если вы выбрали указатели, вам нужно освободить память в деструкторе.
если вы выбрали объекты автоматического хранения (то, что у вас есть сейчас), деструкторы будут вызываться при уничтожении содержащего объекта, поэтому вы не будете освобождать память вручную. Чтобы инициализировать объекты автоматического хранения, которые являются членами класса, вам нужно использовать список инициализации :
Как это:
class C
{
Shape<TwoPoint> solidShape;
Rectangle r;
public:
C() : solidShape(TwoPoint(0,5)), r( TwoPoint(0,8) ) {} //initialization list in constructor
};