C ++中实例变量的算法初始化

时间:2012-05-21 05:56:44

标签: c++ constructor initialization design-patterns instance-variables

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

我们如何管理如下方案:

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

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

可能存在类似的情况,我们需要在构造函数初始化列表以外的位置启动实例变量。我猜GCC会允许这样做(发出警告),但VC ++似乎不允许。

我猜大多数这些都可以使用指针来完成,但我尽量避免使用指针(尽量减少运行时崩溃,也很难调试问题)。

1 个答案:

答案 0 :(得分: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,这只是用于向后兼容的语言 - 在很多情况下正确使用它很棘手。