相关疑难解决方法(0)

如何有条件地实例化一个对象?

我正在尝试做一些有条件的工作:

Type object;
if (cond) {
    doSomeStuff();
    object = getObject();
    doMoreStuff();
} else {
    doSomeOtherStuff();
    object = getDifferentObject();
    doEvenMoreStuff();
}
use(object);
Run Code Online (Sandbox Code Playgroud)

我能想到解决这个问题的唯一方法是复制use代码(它实际上是我的应用程序中的内联代码)并objectif块的每个分支中声明。如果我想避免重复代码,我必须将它包装在一些 use 函数中,就像上面一样。在实际情况下,此use函数可能需要 5 个以上的参数来基本上继承上下文。这一切看起来很混乱,无法维护。

if (cond) {
    doSomeStuff();
    Type object = getObject();
    doMoreStuff();
    use(object);
} else {
    doSomeOtherStuff();
    Type object = getDifferentObject();
    doEvenMoreStuff();
    use(object);
}
Run Code Online (Sandbox Code Playgroud)

解决这个问题的最佳方法是什么?Type没有默认构造函数,因此片段 1 无法编译。

其他一些语言支持片段 1 - 相关问题:Forcing uninitialised Declaration of member with a default constructor

c++ optimization class instantiation conditional-statements

3
推荐指数
3
解决办法
139
查看次数

为什么 C++ 不支持对未初始化变量的智能分析?

这是 Java 涵盖的一个用例:

int x; // UNINITIALISED
if (condition){
   x = 0; // init x;
}
else return;
use(x); // INITIALISED
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 没有任何未初始化的内存(对于 x)
  • 没有非确定性状态
  • 您不能使用未初始化的变量
  • 该变量确实未初始化,不是null0- 但是这不会泄漏到运行时;我认为编译器会在编译时重构代码,因此仅在必要时才x在减速初始化。x可能在代码中未初始化,但是在运行时它保证会被初始化(这就是为什么在初始化之前尝试使用它时会出现错误的原因)。

据我所见/所闻,C++ 不支持这一点,并且将始终运行默认构造函数 - 如果可用 - 即使它是不必要的。

有趣的是,当默认构造函数不可用时,您实际上会在 Java 中使用未初始化的变量获得相同的行为。因此,C++ 编译器显然可以处理这种行为(因为它类没有默认构造函数)。那么,为什么不完全支持呢?

我认为类似int x = delete[[no-default]] int x为此的语法(为了不破坏任何现有代码)将非常直观。


请注意,在 Java 中int xint x = 0-之间存在差异。与@akuzminykhs 评论相反,它不是“初始化为 0”-我不知道为什么人们会赞成它 …

c++ java

-2
推荐指数
1
解决办法
275
查看次数