Передача аргументов объектам, созданным с помощью оператора new?

У меня есть небольшая проблема с C++, для которой я не знаю лучшего решения. У меня есть два класса A и B следующим образом:

class A {
    int n;
    B* b;
public:
    A(int num): n(num) {
        b = new B[n];

        for (int i = 0; i < n; i++) {
            b[i].setRef(this);
        }
    }

    ~A() {
        delete [] b;
    }
};


class B {
    A* a;
public:
    B() { }

    B(A* aref) {
        a = aref;
    }

    void setRef(A* aref) {
        a = aref;
    }
};

Я создаю объект класса A, передавая его конструктору количество объектов класса B, которые я хочу создать. Я хочу, чтобы каждый объект класса B содержал указатель на объект класса A, который его создает. Я думаю, что лучший способ сделать это — передать указатель на объект класса A в качестве аргумента конструктора объекту класса B.

Однако, поскольку я использую оператор new, вызывается конструктор без аргументов для класса B. В результате, единственное решение, которое я здесь вижу, это вызов метода setRef(A*) для каждого объекта класса B после его создания с помощью оператора new.

Есть ли лучшее решение/шаблон проектирования, которое было бы более применимо здесь? Будет ли использование размещения new для класса B лучшим решением?

Заранее спасибо за вашу помощь.


person Community    schedule 24.03.2010    source источник


Ответы (2)


1) Используйте вектор вместо памяти, управляемой памятью. Используйте следующий конструктор вектора для создания объектов B. Это известное ограничение в собственных массивах:

A(std::size_t num): b_vec(num, B(this)), n(num) { }

Поскольку вам не нужен конструктор глубокого копирования для B, подойдет конструктор по умолчанию. Помните, что невозможно построить массив, используя повторяющуюся копию некоторого значения.

2) Используйте размещение new, но это просто решает неправильную проблему IMHO. Если вам не нужно вызывать разные конструкторы для разных объектов вашего массива.

person AraK    schedule 24.03.2010

Есть ли причина, по которой вы не можете использовать STL? Используйте std::vector, если STL в порядке.

e.g.

#include <vector>

class B { ... };

class A
{
  std::vector< B > b;

  A::A( int num )
   : b( num, B( this ) )
  {
  }

  ...
};

При этом создается вектор объектов B, каждый из которых инициализируется вызовом конструктора копирования. Это имеет дополнительный бонус, заключающийся в устранении необходимости также вызывать delete[].

person Ben    schedule 24.03.2010