1

我使用 Java 已经很长时间了,但在习惯 C++ 编程风格时遇到了问题。

我们如何管理如下场景:

  • 实例变量是不能使用默认构造函数创建的对象。在 java 构造函数中,参数可以在更高级别的类构造函数中决定。

  • 实例变量是一种引用类型,我们需要在构造函数中运行一个简单的算法(条件、计算……),然后创建一个对象并将其分配给该引用。

可能有类似的场景,我们需要在构造函数初始化列表以外的地方初始化实例变量。我猜 GCC 会允许这样做(发出警告),但 VC++ 似乎不允许这样做。

我想其中大部分都可以使用指针来完成,但我尽量避免使用指针(以尽量减少运行时崩溃和难以调试的问题)。

4

1 回答 1

2
  • 实例变量是不能使用默认构造函数创建的对象。在 java 构造函数中,参数可以在更高级别的类构造函数中决定。
class A {
public:
  A(int n);
}

class B {
public:
  B(int n) : a1(n), a2(n+1) {}
private:
  A a1, a2;
}
  • 实例变量是一种引用类型,我们需要在构造函数中运行一个简单的算法(条件、计算……),然后创建一个对象并将其分配给该引用。
static int n = 1;
static int m = 2;
class A {
public:
  A(bool useN) : ref(useN ? n : m) {}
private:
  int &ref;
}

您可以在(静态)辅助函数中隐藏更复杂的计算,当然,ref(f(parameters))在初始化列表中。

如果您需要先创建一个对象,然后将其分配给引用,那么该对象主要存在于哪里?毕竟,参考只是指着别人说“那是我,在那边”。如果您的外部对象实际上是拥有该对象的对象,则您不需要引用。您要么想要一个对象,要么想要一个智能指针。

Java 引用可能最接近 C++11 std::shared_ptr,它是标准库中强烈推荐用于日常使用的智能指针之一。在这种设置中,您可能还需要考虑std::uniqe_ptr,它的开销较小,但有限制。它要求您创建正确的复制构造函数这一事实是否是一个问题,这是一个品味问题——通常情况下,默认构造函数的组合shared_ptr并不是您想要的行为,无论如何。

远离std::auto_ptr,这只是为了向后兼容的语言 - 在很多情况下正确使用它是很棘手的。

于 2012-05-21T06:18:03.197 回答