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
}
这是在“A Tour of C ++”单元中,甚至在函数,循环和基本数据类型之类的基本材料之前......我不知道是否/我应该如何理解这段代码。
无论如何,有人可以解释一下吗?它应该是如何“使用接口定义堆栈管理器”
的解释的一部分首先,我特别不知道“typedef Rep& stack
”是什么意思。
答案 0 :(得分:7)
简而言之,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();
}
现在,如果您执行以下操作,则违反了大多数C ++程序员的最小意外原则。
stack p = create();
stack p2 = p;
“最少惊喜的原则”说这将复制堆栈。但实际上,stack
代表类型Rep&
,它是“对Rep的引用”。这意味着第二行创建了p
的别名(引用p
引用的内容)。它不会复制,只是创建另一个引用。
我建议你:远离这些代码。如果您要隐藏Rep
的实施或布局,请实施Pimpl idiom。
答案 1 :(得分:3)
typedef Rep& stack
表示stack
将是Rep&
的同义词。而不是
Rep &r;
你可以写
stack r;
更新: Rep &r
表示r
是对Rep
类型对象的引用。
例如:
Rep rep; // object of type (class) Rep
Rep &ref = rep; // reference to rep
顺便说一句。我不喜欢你发布的代码。
typedef
只是为了让它成为参考,这不是一个好主意;应该清楚地看到某些东西是指针或引用,因为它的行为方式与它看起来不同。
push()
和pop()
应该是类Rep
(或更好Stack
)的方法,或者它是比C ++更多的C代码:)
内存管理;你必须要关心从destroy()
获得的每一个堆栈都会调用create()
。通常使用智能指针来确保正确的内存管理。
答案 2 :(得分:1)
您位于名为“Stack”的名称空间中,以便将您声明的所有符号保持为全局,并可能与其他符号发生冲突。
struct Rep
是一个前向声明,表示有一种名为Rep的结构在其他地方正确定义,即使你不确切知道它具有什么布局,那也就是你所指的那个结构。这里。
typedef Rep& stack
使'stack'成为'Rep&'的字面同义词,正如Messa已经回答的那样。因此,无论你在哪里写'堆栈',它都与写'Rep&'相同。 Rep &
表示对“Rep”类型结构的引用。即使不知道Rep的完整定义,也可以知道引用的大小,因此前向声明不是问题。
其余四行声明了一些函数,这些函数可能会执行名称所暗示的操作,并在评论中提到。
答案 3 :(得分:1)
这是一种显示C编码器如何形成C ++对象的方法; namespace Stack { struct Rep; }
将为您提供Stack::Rep
项目/对象,类似于class Stack { struct Rep;}
。如果您不熟悉C和命名空间,那么在本书的开头就有一个奇怪的例子。
无论如何,这是我最好的猜测,因为我在使用C一段时间后第一次看到这个时,我意识到“哦,这就是对象的类型。它们是名称空间,在编译器中添加了一些额外的乐趣!”< / p>
答案 4 :(得分:0)
typedef Rep& stack
表示如果您使用Stack
,则在名称空间stack
中表示其类型为Rep&
。这就像为一个单词分配一个类型。