namespace Stack {
struct Rep; // definition of stack layout is elsewhere
typedef Rep& stack;
stack create(); // make a new stack
void destroy(stack s); // delete s
void push(stack s, char c); // push c onto s
char pop(stack s); // pop s
}
Run Code Online (Sandbox Code Playgroud)
这是在"A Tour of C++"单元中,甚至在函数,循环和基本数据类型之类的基本材料之前......我不知道是否/我应该如何理解这段代码.
无论如何,有人可以解释一下吗?它应该是如何"使用接口定义堆栈管理器"的解释的一部分
首先,我特别不知道" typedef Rep& stack"是什么意思.
简而言之,stack是一个typedef,用于引用该类型Rep.这意味着,无论何时使用stack,都表示"对Rep的引用"类型.
在我看来,这是一个奇怪的C++课程材料.从界面的外观来看,我们可以假设实现类似于
/* in darkcorner.cpp: */
stack create() { // make a new stack
stack s = *new Rep;
return s;
}
void destroy(stack s) { // delete s
delete &s;
}
void push(stack s, char c) { // push c onto s
s.push(c);
}
char pop(stack s) { // pop s
return s.pop();
}
Run Code Online (Sandbox Code Playgroud)
现在,如果您执行以下操作,则违反了大多数C++程序员的最小惊喜原则.
stack p = create();
stack p2 = p;
Run Code Online (Sandbox Code Playgroud)
"最少惊喜的原则"说这将复制堆栈.但实际上,stack代表类型Rep&,这是"对Rep的引用".这意味着第二行创建了一个别名p(引用引用的内容p).它不会复制,只是创建另一个引用.
我建议你:不要这样的代码.如果要隐藏实现或布局Rep,请实现Pimpl习语.