我应该使用指向OOP对象的指针还是应该创建默认构造函数?

时间:2014-03-04 14:55:53

标签: c++ oop default-constructor

我对c ++对象感到困惑。如果一个对象必须用参数初始化(大多数对象都这样做),我应该创建一个带参数的构造函数,因此在存储时总是创建指向我的对象的指针,或者我应该有一个带有Init()方法的空构造函数初始化对象所需的参数,以便我可以为我的对象设置非指针字段?

编辑:我的意思是:

//A.h
class A
{
    public:
        A(int x);
}
//B.h
class B
{
    private:
        A myobject;
}

将抛出IntelliSense:类“A”

不存在默认构造函数

所以我可以这样做:

//B.h
class B
{
 private:
  A* myobject;
}

OR

//A.h

class A
{
 public:
  A(void);
  void Init(int x);
}

哪一项是正确的做法?

4 个答案:

答案 0 :(得分:5)

初始化列表功能正好存在,因此您可以将参数传递给成员的构造函数。

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

B::B() : a(99) {}

答案 1 :(得分:3)

class A
{
public:
    A(int x) {}
};

class B
{
public:
    B(int x, double y) : a(x) {}
private:
    A a;
};

int main()
{
    B b(23, 78.6);
}

您可以使用初始化列表执行此操作。见http://en.cppreference.com/w/cpp/language/initializer_list

答案 2 :(得分:3)

你可以从B级调用构造函数,但是你必须为A的构造函数提供一个值。

一个例子可能是这样的:

class A{
public:
    A( int x ){};
};

class B{
public:
    B( void ) : _my(0){};
private:
    A _my;
};

或者,您可以通过例如将B中的值传递给A

class A{
public:
    A( int x ){};
};

class B{
public:
    B( int x_b ) : _my(x_b){};
private:
    A _my;
};

我不知道这是否能完全解决您的问题,但它会使您的类成为B的私有类,而无需创建指针以及随附的整个新/删除部分。

干杯

答案 3 :(得分:0)

您建议的两个选项中的任何一个都可以。您应该选择哪一个取决于您的用例。 一般来说,我更喜欢第一个选项,同时确保在B的析构函数中删除A.如果确保A在没有初始化的情况下使用它将正确报告错误,则应该只使用init()方法。