我已经使用Java很长一段时间了,我在习惯C ++编程风格时遇到了问题。
我们如何管理如下方案:
实例变量是无法使用默认构造函数创建的对象。在java构造函数中,参数可以在更高级的类构造函数中决定。
实例变量是一种引用类型,我们需要在构造函数中运行一个简单的算法(条件,计算,...),然后创建一个对象并将其赋给该引用。
可能存在类似的情况,我们需要在构造函数初始化列表以外的位置启动实例变量。我猜GCC会允许这样做(发出警告),但VC ++似乎不允许。
我猜大多数这些都可以使用指针来完成,但我尽量避免使用指针(尽量减少运行时崩溃,也很难调试问题)。
答案 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
,这只是用于向后兼容的语言 - 在很多情况下正确使用它很棘手。