我创建了以下两个C ++文件:
Stack.cpp
#include<iostream>
using namespace std;
const int MaxStack = 10000;
const char EmptyFlag = '\0';
class Stack {
char items[MaxStack];
int top;
public:
enum { FullStack = MaxStack, EmptyStack = -1 };
enum { False = 0, True = 1};
// methods
void init();
void push(char);
char pop();
int empty();
int full();
void dump_stack();
};
void Stack::init()
{
top = EmptyStack;
}
void Stack::push(char c)
{
if (full())
return;
items[++top] = c;
}
char Stack::pop()
{
if (empty())
return EmptyFlag;
else
return items[top--];
}
int Stack::full()
{
if (top + 1 == FullStack)
{
cerr << "Stack full at " << MaxStack << endl;
return true;
}
else
return false;
}
int Stack::empty()
{
if (top == EmptyStack)
{
cerr << "Stack Empty" << endl;
return True;
}
else
return False;
}
void Stack::dump_stack()
{
for (int i = top; i >= 0; i--)
{
cout << items[i] << endl;
}
}
和StackTest.cpp
#include <iostream>
using namespace std;
int main()
{
Stack s;
s.init();
s.push('a');
s.push('b');
s.push('c');
cout << s.pop();
cout << s.pop();
cout << s.pop();
}
然后我尝试编译:
[USER @ localhost cs3110] $ g ++ StackTest.cpp Stack.cpp
StackTest.cpp:函数int main()':
StackTest.cpp:8: error:
Stack'未在此范围内声明
StackTest.cpp:8:错误:期望;' before "s"
StackTest.cpp:9: error:
s'未在此范围内声明
我做错了什么?
答案 0 :(得分:8)
正如您所说,您的Stack
已在Stack.cpp
中宣布。您正试图在StackTest.cpp
中使用它。 Stack
中声明了StackTest.cpp
。你不能在那里使用它。这就是编译器告诉你的。
您必须在所有翻译单元(.cpp文件)中定义类,您计划在其中使用它们。此外,您必须在所有这些翻译单元中以相同方式定义它们。为了满足该要求,类定义通常被分成头文件(.h文件)并包含(使用#include
)到需要它们的每个.cpp文件中。
在您的情况下,您需要创建头文件Stack.h
,其中包含Stack
类的定义(在本例中为常量定义),而不包含任何其他内容
const int MaxStack = 10000;
const char EmptyFlag = '\0';
class Stack {
char items[MaxStack];
int top;
public:
enum { FullStack = MaxStack, EmptyStack = -1 };
enum { False = 0, True = 1};
// methods
void init();
void push(char);
char pop();
int empty();
int full();
void dump_stack();
};
(头文件也受益于使用所谓的包含警卫,但它现在可以如上所示工作。)
此类定义应移动从Stack.cpp
移至Stack.h
。相反,您将包含此.h文件到Stack.cpp
。您的Stack.cpp
将按如下方式开始
#include<iostream>
#include "Stack.h"
using namespace std;
void Stack::init()
{
top = EmptyStack;
}
// and so on...
您以前的Stack.cpp
其余成员,即成员定义,应保持原样。
Stack.h
也应以同样的方式包含在StackTest.cpp
中,因此您的StackTest.cpp
应该以
#include <iostream>
#include "Stack.h"
using namespace std;
// and so on...
基本上就是这样。 (而不是提供init
方法,更好的想法是为Stack
类创建一个构造函数。但这是一个不同的故事。)
答案 1 :(得分:4)
您需要将class Stack { ...
代码的内容移动到新文件Stack.h中。然后将以下行添加到StackTest.cpp和Stack.cpp
#include "Stack.h"
答案 2 :(得分:2)
因为StackTest.cpp不知道Stack是什么。
您应该将Stack类定义提取到Stack.h文件中,然后将#include“Stack.h”提取到Stack.cpp和StackTest.cpp中。
答案 3 :(得分:0)
或者你可以简单地将它重命名为Stack.h,尽管最好只有.h文件只暴露类接口。