需要解释C ++代码

时间:2011-06-02 12:06:17

标签: c++

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”是什么意思。

5 个答案:

答案 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

顺便说一句。我不喜欢你发布的代码。

  1. typedef只是为了让它成为参考,这不是一个好主意;应该清楚地看到某些东西是指针或引用,因为它的行为方式与它看起来不同。

  2. push()pop()应该是类Rep(或更好Stack)的方法,或者它是比C ++更多的C代码:)

  3. 内存管理;你必须要关心从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&。这就像为一个单词分配一个类型。