为什么G ++告诉我“Stack”未在此范围内声明?

时间:2010-01-27 15:31:45

标签: c++

我创建了以下两个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'未在此范围内声明

我做错了什么?

4 个答案:

答案 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文件只暴露类接口。