gpt4 book ai didi

c++ - 为什么 G++ 告诉我 "Stack"没有在此范围内声明?

转载 作者:太空狗 更新时间:2023-10-29 23:29:20 24 4
gpt4 key购买 nike

我创建了以下两个 C++ 文件:

堆栈.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.cppStackTest.cpp:在函数 int main()' 中:
StackTest.cpp:8: 错误:
Stack' 未在此范围内声明StackTest.cpp:8: 错误:预期 ;'在“s”之前
StackTest.cpp:9: 错误:
s' 未在此范围内声明

我做错了什么?

最佳答案

如您所说,您的StackStack.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();
};

(头文件也受益于使用所谓的include guards,但目前它会如上所示工作)。

此类定义应从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 类创建一个构造函数。但那是另外一回事了。

关于c++ - 为什么 G++ 告诉我 "Stack"没有在此范围内声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2148141/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com