在C ++中将对象初始化为类成员

时间:2012-02-21 13:41:09

标签: c++ oop

有三个类。第一个是模板,第二个是模板的通用,第三个是模板。

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;
 }

此处显示的整数值仅供参考,可以是任何内容。

2 个答案:

答案 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);