我如何决定是否应该使用指针或常规变量?

jav*_*red 1 c++

在c ++中,我可以将一个字段声明为某种类型的常规变量,在构造函数中实例化它,并在以后使用它:

private:    Foo field;
...

A::A() {
    // upd: likely i instatiate field wrong ways (see comments)
    field = FieldImpl();
}
....
method(field);
Run Code Online (Sandbox Code Playgroud)

或者我可以使用指针:

private:    Foo* field;
...

A::A() {
    field = new FieldImpl();
}

A::~A() {
    delete field;
}

...
method(*field);
Run Code Online (Sandbox Code Playgroud)

声明字段时,如何判断是否应使用指针或常规变量?

And*_*mas 6

在以下情况下,您可能希望使用指针:

  • 引用的对象可以比父对象寿命更长.
  • 由于大小,您希望确保引用的对象在堆上.
  • 指针是从类外部提供的.
  • Null是一个可能的值.
  • 该字段可以动态设置为不同的对象.
  • 实际对象类型在运行时确定.例如,该字段可能是指向许多子类中任何一个的基类指针.

您可能还想使用智能指针.

上面的最后一点适用于您的示例代码.如果你的字段是Foo类型,并且你为它分配了一个FieldImpl,剩下的就是FieldImpl的Foo部分.这被称为切片问题.