Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C+中实例变量的算法初始化+; 我已经使用java很长时间了,我对C++编程风格有问题。_C++_Constructor_Initialization_Design Patterns_Instance Variables - Fatal编程技术网

C+中实例变量的算法初始化+; 我已经使用java很长时间了,我对C++编程风格有问题。

C+中实例变量的算法初始化+; 我已经使用java很长时间了,我对C++编程风格有问题。,c++,constructor,initialization,design-patterns,instance-variables,C++,Constructor,Initialization,Design Patterns,Instance Variables,我们如何管理以下情况: 实例变量是不能使用默认构造函数创建的对象。在java中,可以在更高级别的类构造函数中确定构造函数参数 实例变量是引用类型,我们需要在构造函数中运行一个简单的算法(条件、计算等),然后创建一个对象并将其分配给该引用 可能存在类似的场景,我们需要在构造函数初始化列表以外的位置初始化实例变量。我猜GCC会允许这样做(发出警告),但VC++似乎不允许这样做 我想其中大部分都可以使用指针来完成,但我正在尽可能避免使用指针(以最小化运行时崩溃和难以调试的问题) 实例变量是不能使

我们如何管理以下情况:

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

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

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

我想其中大部分都可以使用指针来完成,但我正在尽可能避免使用指针(以最小化运行时崩溃和难以调试的问题)

  • 实例变量是不能使用默认构造函数创建的对象。在java中,可以在更高级别的类构造函数中确定构造函数参数
  • 实例变量是引用类型,我们需要在构造函数中运行一个简单的算法(条件、计算等),然后创建一个对象并将其分配给该引用
当然,您可以在(静态)辅助函数中隐藏更复杂的计算,在初始值设定项列表中有
ref(f(参数))

如果需要先创建对象,然后将其指定给引用,那么该对象主要位于何处?毕竟,引用只是指某人指着别人说“那边是我。”如果你的外部对象实际上是拥有这个对象的对象,你就不需要引用。您需要对象或智能指针

Java参考可能最接近于C++11的
std::shared_ptr
,这是标准库中强烈建议日常使用的智能指针之一。在这种设置中,您可能还需要考虑<代码> STD::UNIQEYPTPT/<代码>,它开销小一些,但有局限性。它是否需要您创建一个正确的副本构造函数是一个问题,这取决于您的品味——通常,默认构造函数与
shared_ptr
组合并不是您想要的行为


请远离std::auto_ptr,它只使用向后兼容的语言–在很多情况下正确使用它很困难。

我不确定我是否理解第一点。你不能只调用一个非默认的构造函数,比如一个带参数的构造函数吗?你可以,但只能在初始值设定项列表中。这与Java中的方式不同。@juanchopanza:是的,但在本例中,参数是在运行代码后识别的。它们在实例化更高级别的类时不可用…
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;
}