有三个类。第一个是模板,第二个是模板的通用,第三个是模板。
template <class T>
class Shape {
T val,val_new;
public:
Shape(T initval)
{
val=initval;
}
...
};
class TwoPoint
{
int width;
int value;
public:
TwoPoint()
{
value=0;
width=0;
}
TwoPoint(int v, int w)
{
value=v;
width=w;
}
TwoPoint(const TwoPoint& t)
{
value= t.value;
width= t.width;
}
...
};
class Rectangle
{
private:
Shape<TwoPoint> val;
TwoPoint newval;
public:
Rectangle(TwoPoint i)
: val (Shape<TwoPoint> (i)) {}
....
};
我想在其他类中初始化Rectangle和solidShape作为类成员,可以在java中完成,如:
Rectangle r = new Rectangle(new TwoPoint(0,8));
Shape<TwoPoint> solidShape = new Shape<TwoPoint>(new TwoPoint(0,5));
我如何在C ++中做类似的事情?我想创建一个类似的实现:
class C
{
public:
// initialize Rectangle here;
// initialize solidShape here;
}
此处显示的整数值仅供参考,可以是任何内容。
答案 0 :(得分:2)
在C ++中使用转换构造函数的正确方法是通过const引用:
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
};
答案 1 :(得分:0)
我们使用const引用作为构造函数参数和初始化构造函数链:
template <class T>
class Shape {
T val,val_new;
public:
Shape(const T & initval) :
val(initval)
{
}
...
};
class TwoPoint
{
int width;
int value;
public:
TwoPoint() :
value(0),
width(0)
{
}
TwoPoint(int v, int w) :
value(v),
width(v)
{
}
TwoPoint(const TwoPoint& t)
value(t.value),
width(t.width)
{
}
...
};
class Rectangle
{
private:
Shape<TwoPoint> val;
TwoPoint newval;
public:
Rectangle(const TwoPoint & i)
: val (Shape<TwoPoint> (i))
{}
....
};
你创建这样的对象:
TwoPoint t(0,8)
Rectangle r(t);
Shape<TwoPoint> shape(t);