我想在多个 if-else 分支中初始化一个变量,稍后使用它,基本上是这样的:
Foo foo;
if (someCondition) {
std::string someString = getTheString();
// do some stuff
foo = Foo(someString);
} else {
int someInt = getTheInt();
//do some other stuff maybe
foo = Foo(someInt);
}
// use foo here
Run Code Online (Sandbox Code Playgroud)
不幸的是,在这个例子中,类型Foo有一个删除的默认构造函数,所以上面的代码不能编译。有没有办法以这种方式初始化这样的变量?
编辑:
正如您在我的示例中看到的那样,我使用了不同的构造函数,并且还在 if/else 块中执行了其他操作,因此不幸的是,三元运算符不起作用。
如果没有办法,没有foo指针,我显然可以采取不同的方法,但我很好奇,如果我的方法以某种方式起作用。
在一道算法题“通过链表实现队列”中,解法显示首先创建 Node 类:
class Node {
public int val;
public Node next;
public Node(int _val) {
val = _val;
next = null;
}
}
Run Code Online (Sandbox Code Playgroud)
请问 的前导下划线是什么意思val = _val?
隐式编译器创建的默认构造函数是否可以有多个 null 主体?根据IBM的网站,答案是:不。
我有这个项目有点难倒我:
这是声明一个名为 StackWalkerToConsole 的类的实例,没有定义默认构造函数的地方:
void func5()
{
StackWalkerToConsole sw;
...
}
Run Code Online (Sandbox Code Playgroud)
这会以某种方式导致其父类的用户定义构造函数之一被调用:
StackWalker::StackWalker(int options, LPCSTR szSymPath, DWORD dwProcessId, HANDLE hProcess)
{
// The function has a body, I just removed it for clarity's sake.
...
}
Run Code Online (Sandbox Code Playgroud)
因此,我在这个构造函数上放置了一个断点,并使用调用堆栈查看了 StackWalkerToConsole 的默认构造函数。由于源码中没有定义,所以只能看它的反汇编:
StackWalker_VC2017.exe!StackWalkerToConsole::StackWalkerToConsole(void):
0000000140008210 mov qword ptr [rsp+8],rcx
0000000140008215 push rdi
0000000140008216 sub rsp,40h
000000014000821A call qword ptr [__imp_GetCurrentProcess (014012E060h)]
0000000140008220 mov qword ptr [rsp+30h],rax
0000000140008225 call qword ptr [__imp_GetCurrentProcessId (014012E068h)]
000000014000822B mov rcx,qword ptr [rsp+30h]
0000000140008230 …Run Code Online (Sandbox Code Playgroud) 显然Java认为我的构造函数代码并不重要,所以当我尝试访问我认为已初始化的ArrayList时,它完全忽略它然后用NullPointerException对我大喊大叫.只有当我向构造函数添加任意参数时,Java才会认为值得关注.
import java.util.ArrayList;
public class DataManager {
ArrayList<Variable> vars;
public DataManager() {
vars = new ArrayList<Variable>();
}
public void createVar(String type, String name, String strValue, int numValue) {
vars.add(new Variable(type, name, strValue, numValue));
}
}
Run Code Online (Sandbox Code Playgroud)
以及调用此代码的代码:
DataManager data = new DataManager();
data.createVar(...);
Run Code Online (Sandbox Code Playgroud)
变量类:
class Variable {
String type;
String name;
String strValue;
int numValue;
public Variable(String type, String name, String strValue, int numValue) {
this.type = type; this.name = name;
this.strValue = strValue;
this.numValue = numValue;
}
}
Run Code Online (Sandbox Code Playgroud)
运行此结果
线程"main"中的异常java.lang.ArrayIndexOutOfBoundsException:在SudoCode.main(SudoCode.java:6)的SudoCode.go(SudoCode.java:10)的Parser.start(Parser.java:25)处出现1 …
根据Oracle的文档https://docs.oracle.com/javase/tutorial/java/IandI/super.html,其书面内容是:如果超类没有无参数构造函数,则会出现编译时错误。
但就我而言,我有一个没有任何构造函数的超类。在我的基类中,我正在其无参数构造函数中编写super()。在这里,我在超类中没有no-arg构造函数,但是它没有显示任何错误。
class Person {
}
Run Code Online (Sandbox Code Playgroud)
/* subclass Student extending the Person class */
class Student extends Person {
Student() {
// invoke or call parent class constructor
super();
System.out.println("Student class Constructor");
}
}
Run Code Online (Sandbox Code Playgroud)
// Driver class
class Practice {
public static void main(String[] args) {
Student s = new Student();
}
}
Run Code Online (Sandbox Code Playgroud) 为什么只有默认构造函数才能创建vptr(虚拟表指针)和vtable(虚拟表)?为什么参数构造函数不能
如果我在Java中创建一个只有一个实例变量的整数数组的简单类,那么对于默认构造函数有什么意义呢?我不想把它留空.
constructor ×4
java ×4
c++ ×3
arrays ×1
inheritance ×1
parameters ×1
vptr ×1
vtable ×1
winapi ×1
x86 ×1