将参数传递给使用new运算符创建的对象?

时间:2010-03-24 21:46:01

标签: c++ new-operator

我有一个小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;
    }
};

我正在通过向其构造函数传递我想要创建的B类对象的数量来创建A类的对象。我希望B类的每个对象都拥有一个指向创建它的类A对象的指针。我认为最好的方法是将指针传递给A类对象作为B类对象的构造函数参数。

但是,由于我正在使用new运算符,因此调用了类B的no-args构造函数。因此,我在这里看到的唯一解决方案是在使用setRef(A*)运算符构造B类的每个对象后调用new方法。

是否有更好的解决方案/设计模式更适用于此?对B类使用展示位置new会更好吗?

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

1)使用向量而不是内存管理的内存。使用vector的以下构造函数来创建B对象。这是本机数组中的已知限制:

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

因为您不需要B的深拷贝构造函数,所以默认构造函数可以使用。请记住,没有办法使用某个值的重复副本构造数组。

2)使用placement new,但那只是解决了错误的问题恕我直言。除非您需要为数组的不同对象调用不同的构造函数。

答案 1 :(得分:1)

你有没有理由不能使用STL?如果STL没问题,请使用std::vector

e.g。

#include <vector>

class B { ... };

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

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

  ...
};

这将创建一个B对象的向量,通过调用复制构造函数对每个对象进行初始化。这还有一个额外的好处,即无需调用delete[]