问题标签 [member-initialization]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
525 浏览

c++ - 成员初始化部分的复杂语句?

我有这个:

我需要根据和values的值使用不同的函子初始化成员。不幸的是,决定使用哪个仿函数的逻辑并不那么简单,一旦构建,我就无法更改其关联的比较仿函数。param1param2values

所以......我需要将所有决策逻辑放在成员初始化部分,但我不知道如何使用?:运算符。
是否可以在其中放置更复杂的语句?(如switch语句)

如果没有,有没有办法延迟构造,values所以我可以在构造函数的主体中初始化它?

谢谢。

0 投票
6 回答
12354 浏览

c++ - 有条件地初始化 C++ 成员变量的正确方法?

我敢肯定这是一个非常简单的问题。以下代码显示了我正在尝试做的事情:

这不会编译,因为m_class是使用空构造函数(不存在)创建的。这样做的正确方法是什么?我的猜测是使用指针和实例化m_classusing new,但我希望有一种更简单的方法。

编辑:我应该早点说,但我的实际问题还有一个复杂的问题:我需要在初始化 m_class 之前调用一个方法,以便设置环境。所以:

是否可以通过花哨的初始化列表技巧来实现这一点?

0 投票
4 回答
207 浏览

c++ - 如何正确避免 CS2512

请帮我解决以下问题:

我有以下课程:

实现是显而易见的。我打算使用 Init 方法初始化 CombinationRule 以最小化代码重复。唉,如果我不在每个构造函数中使用“成员初始化列表”,编译器会抱怨“错误 C2512:'ChemicalElement':没有适当的默认构造函数可用”。有没有一种优雅的方法来解决这个错误,而不是使用默认构造函数或成员初始化列表?顺便说一句:如果类定义中有任何其他问题,请也添加它。由于我正在重新访问 C++,因此我想了解它们。

0 投票
8 回答
121577 浏览

c++ - 如果我不明确地初始化,C++ 类成员如何初始化?

假设我有一个包含私人成员ptrnamepnamernamecrname的课程age。如果我不自己初始化它们会怎样?这是一个例子:

然后我做:

ex中的成员是如何初始化的?指针会发生什么?使用默认构造函数进行0初始化string和? 参考成员呢?还有 const 引用呢?intstring()int()

我想学习它,以便我可以编写更好(无错误)的程序。任何反馈都会有所帮助!

0 投票
1 回答
511 浏览

c++ - 成员初始化:GCC 中的错误还是我的想法?

我在班级的私有部分定义了一个枚举类型。我也定义了这种类型的成员。当我尝试在构造函数主体中初始化此成员时,我在运行时遇到内存损坏问题。当我通过同一个构造函数中的初始化列表对其进行初始化时,我不会遇到内存损坏问题。难道我做错了什么?

我将简化代码,如果它是一个 GCC 错误,我确信它是我正在组合/继承/等的特定类的组合,但我保证这抓住了问题的本质。在初始化之前没有使用此成员变量,并且在完全构造之前没有使用新创建的对象。这个成员的初始化确实是我在body中做的第一件事,当内存损坏发生时,valgrind说它在我初始化变量的那一行。Valgrind 说这是一个大小为 4 的无效写入。

相关标题代码:

相关的 .cpp 代码(导致内存损坏和崩溃):

相关的 .cpp 代码(不会导致内存损坏和崩溃):

编辑:请参阅我的“答案”以了解导致此问题的原因。阅读后,有人可以向我解释为什么它会有所不同吗?我没有更改标头中的任何内容,显然目标文件正在重建,因为我将它们放入时出现了我的打印语句,并且在一个构建下没有看到错误,但在另一个构建下没有看到错误?

为了得到一个很好的解释,我将其标记为这个问题的答案。

0 投票
2 回答
4557 浏览

c++ - 成员初始化

可能重复:
C++ 初始化列表

类中的成员初始化和直接初始化有什么区别?类中定义的两个构造函数有什么区别?

0 投票
1 回答
528 浏览

c++11 - 没有构造函数的 C++0x 成员初始化

N3257 中,我找到了一个使用没有构造函数的初始化成员的示例,这很好。我想这是可能的,因为它是一个 POD。

当我玩这个例子时,我用 a 替换*&,因为我不喜欢原始指针:

这很好,并且在没有警告的情况下使用 GCC-4.7.0 编译。

然后我对 POD 的初始化以及 C++0x 可能发生的变化感到好奇。在那里我找到了 Bjarnes FAQ。他在那里说 POD 可能包含指针,但没有引用

操作,现在我想知道:

  • 我这里是否有非 POD 对象,编译器无论如何都可以在没有构造函数的情况下对其进行初始化,而我只是想念这里使用了哪些机制?
  • 或者GCC-4.7.0 是否通过让我以这种方式初始化 ref 来表现非标准?
  • 还是自 Bjarnes FAQ 以来 std 发生了变化,也允许在 POD 中引用?

更新:我在当前 std ( 8.5.1 Aggregates [dcl.init.aggr] ) 中找到了聚合,但那里没有提到引用,所以我不确定它们与这个有什么关系

0 投票
2 回答
477 浏览

java - Java实例成员初始化抛出异常

假设我有以下课程

现在有了创建B实例的工厂,但是creator方法抛出异常

如果我在声明行中设置 Ab 那么我将无法处理异常

如果我在构造函数中设置 Ab 那么我要么有一个“半生不熟”的实例,要么我再次抛出一个异常并强制调用代码处理一个未正确初始化的实例

或者

我可以尝试惰性初始化 B 的实例:

但我能想到使其线程安全的唯一方法是通过已知在 java 的 JVM 中被破坏的双重检查锁定

那么,亲爱的耐心读者,我该怎么办?

换句话说,初始化包含对创建的对象的引用的对象实例的最佳解决方案可能会引发异常?

0 投票
2 回答
1153 浏览

c++ - 在初始化列表之前执行检查

我在自己的类中有一个类 A 的成员,它的构造函数接受多个参数。我将自己类的参数转发给类 A 的构造函数。但重要的是这些参数是正确的,所以我需要在构造 A 的成员之前检查它们。问题是:我可以省略成员中的成员初始化列表,有效调用默认构造函数。在构造函数中检查之后,我可以在分配中调用 A 的构造函数。虽然,这会产生错误,因为 A 的析构函数是私有的。

我该如何解决这个问题?

0 投票
1 回答
972 浏览

c++ - Clang++ 非静态数据成员初始化错误?C++11

我似乎无法弄清楚 Clang 在说什么,或者它是否正确,因为 G++-4.7 似乎可以很好地编译它。

该错误来自尝试std::uniform_int_distribution使用大括号为非静态成员初始化。

以下失败(token_count是模板参数): std::uniform_int_distribution<Int> random_dist{0, token_count-1};

出现错误:

但是,我可以通过这样做来初始化它:

std::uniform_int_distribution<Int> random_dist = std::uniform_int_distribution<Int>(0, token_count - 1);

我正在使用以下命令来编译它:clang++ -std=c++11 -stdlib=libc++ -lc++abi使用 Clang-3.2。

输出clang -v