问题标签 [initialization-order]
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.
java - 在静态字段之前初始化的非静态字段
注意:我打算将其作为问题发布,但我尝试在 SSCCE 中重现该问题导致我找到了下面发布的解决方案。
我的代码中有一个类,其中一个非private
字段在字段之前static
初始化。我无法在以下 SSCCE 中重现该问题:static
final
由于某种原因,File myDefaultPath
在JFileChooser myFileChooser
.
不应该static
(尤其是static final
)字段首先初始化吗?
c++ - C++ 标准:为什么定义了一些“命令”而没有定义?
- 拥有一个类,其成员的初始化顺序在构造函数中被强烈定义(可能允许成员之间的依赖关系,就像在这个问题中一样- 但我认为这更多是一个设计问题,我可以想象循环依赖关系)。
- 有一个函数调用,参数评估的顺序没有定义,我认为这是为了 C 兼容性。
我们对以下“可怕的钻石”问题有一个错误:
编译器不知道选择哪个版本,顺序被定义为不明确的。为什么根本不使用此问题中定义的“从左到右的深度优先分辨率顺序” (答案令人信服),即选择 B 而不是 C?
那么为什么会有这些不同的方法呢?为什么对 1 有严格的顺序而不对 3 有严格的顺序?保持 1 未定义不是更简单吗?还是 2 简单地定义为从左到右?
c++ - 如何在派生类中存储在基类初始化期间获得的信息?
我有这样的情况,作为提出数据来初始化基类的副作用,派生类计算了一条信息,该信息以后必须通过其接口可用。下面给出了问题的一个概念,使用布尔值作为所需的信息:
这样做的问题是,重要的信息是在基类初始化期间计算的,在派生类自己的数据成员初始化之前。因此,我还不能写入派生类的数据元素。虽然我确信我可以在过去 20 年遇到的任何平台上使用尚未正式创建的布尔值,但我想避免调用未定义的行为。
请注意,所讨论的信息与基类完全无关,因此无法将其存储在基类中。此外,信息不能存储在静态数据成员中。关于如何重构代码以便我可以做到这一点,我有一些想法,但是对于这样一个小问题,我能想出的所有想法似乎都非常具有侵入性。所以我想知道你们中的一个人是否能想出一些简单的东西?
注意:由于我们在嵌入式平台上,所以我们坚持使用 GCC 4.1.2。所以严格来说是 C++03(包括 TR1),但没有 C++11。
delphi - 使用初始化部分进行模块注册是个好主意吗?
我正在为分散的模块注册寻找一个好的解决方案。
我不想要一个使用项目的所有模块单元的单个单元,但我宁愿让模块单元自己注册。
我能想到的唯一解决方案是依赖initialization
Delphi 单元。
我写了一个测试项目:
单元2
单元3
单元4
不过,这有一个缺点。是否保证我的注册单元(在这种情况下为Unit2
s)initialization
部分总是首先运行?
我经常阅读有关initialization
部分的警告,我知道我必须避免在其中引发异常。
c++ - 类层次结构中的静态初始化顺序
我最近痛苦地意识到了Static Initialization Order Fiasco。我想知道“跨翻译单元未定义初始化顺序”的规则是否仍然适用于父类中的静态成员,而子类中的静态成员需要这些静态成员。
例如,假设我们有(为简洁起见,排除所有 # 保护和包含)
然后是 的子类A
,
这里有两个翻译单元,其中一个带有静态对象,取决于另一个初始化时的静态对象……看起来它可能是静态初始化顺序惨败的一个实例。
我的问题是:它真的安全吗?
也就是说,我是否保证没有机会包含从后者初始化之前B::id
复制的垃圾?A::count
从我自己的测试来看,A
似乎总是首先被初始化,但我不确定如何在初始化顺序中引入噪声以增加如果行为未定义的失败概率。
c++ - 使用指向类私有方法的指针的命名参数惯用语
在做一些可能不是真正“传统”的事情时,我遇到了 C++ 编译错误。为了让事情变得更容易,我只是以更易于阅读的方式重新编写了我试图使用的机制,并检查了我是否遇到了同样的问题。
首先这里是代码:
test.h // - - C++ - -
test.cpp // - - C++ - -
这是错误:
所以,我不确定这是实现我想要的最好的方法(可能不是,无论如何,如果你有其他建议,他们是非常受欢迎的)但我现在的目标是让它发挥作用或确切地理解为什么它不能工作让我从中学到一些东西!
基本思想是:
- 类“item”可以使用命名参数惯用语使用连接到其构造函数的类“init”的方法“has_funcPtr”来初始化,例如:“init().has_funcPtr(&function_name)”。
- 类“user”可以将指向其私有方法“func1”的指针存储为其类型为“item”的私有成员的私有成员。
这样,当调用对象“item”的特定方法时(为简单起见,我不在这里包含这么长的部分,因为它与错误无关,而只是描述这段代码的目标)该方法可以做一些事情并通过指向函数的指针调用其父对象“用户”的私有方法(我希望这足够清楚......)。
现在,我认为对象的初始化顺序存在问题,但我不确定在哪里以及如何修复它。特别是我认为,由于“func1”方法不对“user”类的任何成员进行操作,那么它的引用可以直接在初始化列表中用于初始化“init”对象并将其提供给“item” “ 目的。
谢谢大家
java - 我的本地绑定服务之一依赖于另一个。如何确保在它的依赖项准备好之前不使用它?
我将我的 Android 应用程序的一部分实现为两个本地绑定服务,一个依赖于另一个。(我只bindService()
与它们一起使用;从不startService()
。)但是,当我绑定具有依赖项的服务时,我会在它自己的依赖项准备好之前获得对它的“绑定”和“连接”引用。这使得对其某些方法的调用失败。如何确保在连接其依赖服务之前不使用我的服务?我可以延迟我的服务的连接直到它自己的依赖项被连接吗?
通常,人们只会获得对已准备好使用的绑定服务的引用,因为onCreate()
它们onBind()
已经被调用过。但是,当您为服务调用bindService()
服务onCreate()
时A
,连接到B
的onServiceConnected()
回调B
可以(在我的情况下是!)在连接到之后调用。默认情况下,一切都在同一个(主 UI)线程中运行,因此您不能只在连接返回之前让'等待连接。onServiceConnected()
A
A
onBind()
B
我做了一个简单的应用程序来演示这个问题。以下是相关摘录。我的活动加载具有依赖项的服务,ServiceA
:
这是ServiceB
,这ServiceA
取决于:
这是ServiceA
:
我已将这两项服务添加到AndroidManifest.xml
. 当我运行它时,serviceB
正在null
调用serviceA.getGreeting()
from setGreeting()
,因为connectionB.onServiceConnected()
还没有被调用。
有什么方法可以让我connectionA.onServiceConnected()
只有在被调用后才能被调用connectionB.onServiceConnected()
?或者我怎么能确保我不使用serviceB
之前serviceA.serviceB
已经设置?
我注意到,如果不是setGreeting()
直接调用 in onServiceConnected()
,而是直接调用post()
到 looper 队列的末尾,问题似乎就消失了:
我想这是因为所有onServiceConnected()
要进行的调用都恰好在 looper 的队列中,所以通过等待所有当前任务,在被调用serviceA.serviceB
时已经准备好。setGreeting()
但这对我来说并不可靠。这可靠吗?有没有更可靠的方法可以等到我的服务准备好?
c++ - 构造函数的初始化列表中的函数调用是否按顺序排列?
考虑:
我知道由于它们a
在.b
struct
我也知道对f
in的两个调用g(f(), f())
是无序的。
所以我想知道是否可以保证t.a == 0
并且t.b == 1
?
c++ - 从全局对象的构造函数调用时的 std::atexit 排序
cppreference 说std::atexit
:
这些函数可以与具有静态存储持续时间的对象的销毁以及彼此同时调用,以保证如果 A 的注册是在 B 的注册之前排序的,那么对 B 的调用在调用之前排序A、同样适用于静态对象构造函数之间的排序和对 atexit 的调用
我理解这段话的意思是,如果std::atexit
在静态初始化期间调用,注册函数将在静态对象的销毁期间被调用,就在静态对象的销毁之前,该静态对象是std::atexit
在调用注册函数时最后初始化的。我还将“可能同时调用”解释为意味着调用可以发生在静态对象破坏之间,而不是对该词的多线程解释。
我想知道一个对象在初始化开始或完成时是否被视为已初始化(在此排序的上下文中)。我写了一个简短的测试来测试这个:
我得到的输出是(http://cpp.sh/3bllu):
这使我相信my_foo
在构造完成之前不会在这种情况下被认为是初始化的。换句话说,该函数被认为在my_foo
初始化之前已经注册,因此注册的函数在my_foo
' 的销毁之后执行。
我似乎找不到任何可以保证这种行为的东西,我什至不完全确定我对引用段落的初步解释是正确的。我描述的行为是我可以依赖的东西,还是实现定义甚至未定义的行为?
java - 当嵌套枚举在其构造函数中引用父静态成员时,为什么我会得到 NPE?
重新创建的条件(据我所知):
- 嵌套枚举引用父静态成员
- 嵌套类
- 父类的静态成员将枚举作为嵌套类的构造函数参数
- enum 在父类中的任何其他内容之前被外部类引用