奇怪的问题,不知道哪里错了,请大侠指教!!

staryshine2008 2004-06-29 09:18:08
//PeekbackStack.h
#include <deque>
class PeekbackSack
{
public:
PeekbackSack(int size):stack(size){}

bool empty() const { return stack.empty();}
bool full() const {return stack.max_size()==stack.size();}
int top() const {return stack.size()-1;}

int pop()
{
if(empty())
throw "empty stack";

int v=stack(top());
stack.pop_back();
return v;
}

void push(int value)
{
if(full())
throw "stack full";
stack.push_back(value);
}

bool peekback(int index,int &value) const;

private:
deque<int> stack;
};
inline bool
PeekbackSack::peekback(int index,int &value) const
{
if(empty())
{
return false;
}
if(index<0||index>top())
{
value=stack[top()];
return false;
}
value=stack[index];
return true;
}
//PeekbackStack_main.cpp
#include <iostream>
#include "PeekbackStack.h"

using namespace std;

int main()
{
PeekbackStack s(0); //preallocate an empty stack

cout << "stack empty should be true;"
<< "it is" << s.empty()<<"\n";
cout << "stack full should be false;"
<< "it is" << s.full() <<"\n";
for(int i=0;i<5;i++)
s.push(i+10);
int v;
s.peekback(0,v);
cout << "s[0] should be 10; it is" << v <<"\n";
s.peekback(1,v);
cout << "s[1] should be 11; it is" << v <<"\n";
s.peekback(2,v);
cout << "s[2] should be 12; it is" << v <<"\n";
s.peekback(3,v);
cout << "s[3] should be 13; it is" << v <<"\n";
s.peekback(4,v);
cout << "s[4] should be 14; it is" << v <<"\n";
s.peekback(5,v);
cout << "s[5] should be false; it is" << s.peekback(5,v) <<"\n";
}
...全文
150 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
qwertasdfg123 2004-06-29
  • 打赏
  • 举报
回复
using 声明是一次性的引入名字到当前的范围。
using 指示符在当前范围内直接声明了名字空间中的的所有名字。

///////////////////////////
它的效果相当于去掉了该名字空间

不是很理解。
我理解为:全局命名空间每时刻只能有一个,如果使用了using指示符声明命名空间,那么就把它作为全局命名空间。
using 声明和using 指示符命名的范围是不一样的。

staryshine2008 2004-06-29
  • 打赏
  • 举报
回复
是这个样子呀,谢谢。
顺便在问一下。
在c++primer上看到using声明有以下特性
它在该域中必须唯一
在外围域中的声明引入的相同名字被其隐藏
它被嵌套域中的相同名字的声明隐藏
在看using指示符时,书上提到它的效果相当于去掉了该名字空间,看完了很晕,那不是
和using声明一样了嘛?
qwertasdfg123 2004-06-29
  • 打赏
  • 举报
回复
需要根据命名空间来查找相应的函数或其它。
如果不加std,系统就会默认为全局的命名空间,那是肯找不到的。
staryshine2008 2004-06-29
  • 打赏
  • 举报
回复
谢谢大家了,问题解决了。
还想问一下,有的时候我已经包含相应的头文件了,而且用的类名也没有和标准命名空间的
名称重复,那为什么有的时候还要加上限定修饰符std呢??
qwertasdfg123 2004-06-29
  • 打赏
  • 举报
回复
不会哦!


你在头文件加入了using namespace std;

或者改为
std::deque<int> stack;
staryshine2008 2004-06-29
  • 打赏
  • 举报
回复
可是我的程序还是有错误呀,而且和第一次的一样,郁闷中……
qwertasdfg123 2004-06-29
  • 打赏
  • 举报
回复
是可以的。
staryshine2008 2004-06-29
  • 打赏
  • 举报
回复
好像要获得栈头元素的话,也可以用stack[top()]吧,因为我看到文档上说
the standard C++ deque class allows direct access to objects through the use of the subscript [] operator.
staryshine2008 2004-06-29
  • 打赏
  • 举报
回复
Method deque()

Access Public

Classification Constructor

Syntax explicit deque(size_type N, const T& Value = T(),const Allocator& X = Allocator())

Parameters X is a allocator object. N is the number of objects that have been initialized
with value that will be inserted into the deque.

Return None.


Description
The deque() method constructs a deque that contains N objects that have been initialized to value.
哦,我明白了,多谢无名了!
GBBU 2004-06-29
  • 打赏
  • 举报
回复
//int v=stack(top());
int v=stack.front();
qwertasdfg123 2004-06-29
  • 打赏
  • 举报
回复
stack(top());表示分配队列的空间,并不是返回栈顶元素
staryshine2008 2004-06-29
  • 打赏
  • 举报
回复
按无名的改了,还是提示出错,第一个错误就指向#include "PeekbackStack.h"
而且觉得int v=stack(top());没必要改,因为它返回栈顶元素。
类名是我拼写错误,已经改过来了。
darkstar21cn 2004-06-29
  • 打赏
  • 举报
回复
呵呵,楼主不好的书写习惯。楼上两位好仔细。
qwertasdfg123 2004-06-29
  • 打赏
  • 举报
回复

如上我已经解决了。
staryshine2008 2004-06-29
  • 打赏
  • 举报
回复
哦,不好意思,忘了把错误贴出来了,抱歉。
Compiler: Default compiler
Building Makefile: "D:\Code_Cplus\DEV\Makefile.win"
Executing make...
make.exe -f "D:\Code_Cplus\DEV\Makefile.win" all
g++.exe -c PeekbackStack_main.cpp -o PeekbackStack_main.o -I"C:/Dev-Cpp/include/c++" -I"C:/Dev-Cpp/include/c++/mingw32" -I"C:/Dev-Cpp/include/c++/backward" -I"C:/Dev-Cpp/include"

In file included from PeekbackStack_main.cpp:2: //这个错误标示我引用头文件出错
PeekbackStack.h:32: 'deque' is used as a type, but is not defined as a type.

PeekbackStack.h: In constructor `PeekbackSack::PeekbackSack(int)':
PeekbackStack.h:6: class `PeekbackSack' does not have any field named `stack'

PeekbackStack.h: In member function `bool PeekbackSack::empty() const':
PeekbackStack.h:8: `stack' undeclared (first use this function)

PeekbackStack.h:8: (Each undeclared identifier is reported only once for each

function it appears in.)

PeekbackStack_main.cpp: In function `int main()':
PeekbackStack_main.cpp:8: `PeekbackStack' undeclared (first use this function)

PeekbackStack_main.cpp:8: parse error before `(' token

PeekbackStack_main.cpp:11: `s' undeclared (first use this function)

make.exe: *** [PeekbackStack_main.o] Error 1

Execution terminated
darkstar21cn 2004-06-29
  • 打赏
  • 举报
回复
楼主轻说清楚点是什么问题?
qwertasdfg123 2004-06-29
  • 打赏
  • 举报
回复
还有就是main函数加个返回值。return 0;
qwertasdfg123 2004-06-29
  • 打赏
  • 举报
回复
1.不应该是int v=stack(top());
而是 int v = top();

2.类名不是PeekbackStack
而是 PeekbackSack

64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧