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

3

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

或者

//A.h

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

哪个是正确的做法?

4
为什么需要使用指针? - chris
如果类型没有默认构造函数,我不能拥有该类型的字段,除非它是一个指针。 - pixartist
5
可以的。当然可以。 - juanchopanza
当编写以下代码时,我遇到了 IntelliSense 错误:no default constructor exists for class "Shader" public: Shader shader; - pixartist
5
使用构造函数初始化列表,并阅读一本好的C++入门书籍,应该会在那里有解释。 - juanchopanza
1
@所有人,我认为实际上被问到的问题是:“当ClassName没有提供默认构造函数时,我该如何使用ClassName t?” - user229044
4个回答

5

初始化列表特性正是为了让你能够向成员的构造函数传递参数。

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

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

当a没有默认构造函数时,这是否有效? - pixartist
它将一个 int 传递给 a 的构造函数。所以,是的,它可以工作。 - Sebastian Redl
哇,我不知道那个! - pixartist
3
欢迎来到C++。准备好一本好书。 - Sebastian Redl
请您升级搜索技能,因为我200%确定这是重复的 :) - legends2k
我知道初始化列表,只是不知道它们可以做到这一点。 - pixartist

3

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的私有类,而无需创建指针和相关的new/delete部分。

祝好


0

你提出的两个选项都可以。你应该根据你的使用情况来选择一个。 通常我更喜欢第一种选项,同时确保在B的析构函数中删除A。只有在确保A未经初始化就被使用时会正确报告错误时,才应该使用init()方法。


在这种情况下根本不需要使用指针。如果他真的这样做了,那么它应该是一个智能指针而不是裸指针,在任何情况下都不需要显式地删除它。 - const_ref

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接