Инициализируйте объекты как члены класса в C ++ - PullRequest
1 голос
/ 21 февраля 2012

Существует три класса. Первый является шаблоном, второй действует как шаблон для общего шаблона, а третий реализует шаблон.

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 ]

2 голосов
/ 21 февраля 2012

Правильный способ иметь конструктор преобразования в 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    
 };
0 голосов
/ 21 февраля 2012

Мы используем ссылки 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...