【发布时间】:2020-11-28 17:02:22
【问题描述】:
我正在尝试学习 C++,目前我正在使用指针实现堆栈,但我在使用标头和 include 指令时遇到了问题。
这是我的代码:
Main.cpp:
#include <stdio.h>
#include <iostream>
#include "Nodo.h"
#include "Pila.h"
using namespace std;
int main() {
Pila pila;
cout << "Apilar(20)" << endl;
pila.apilar(10);
pila.apilar(20);
pila.apilar(30);
cout << pila.desapilar() << endl;
cout << pila.desapilar() << endl;
cout << pila.desapilar() << endl;
return 0;
};
Pila.h:
#ifndef PILA_H
#define PILA_H
#include "Nodo.h"
#include <cstddef>
class Pila {
private:
Nodo cima;
public:
Pila();
~Pila();
void apilar(int v);
int desapilar();
};
#endif // PILA_H
Pila.cpp:
#include "Pila.h"
#include "Nodo.h"
Pila::Pila(){
cima = NULL;
}
Pila::~Pila()
{
while(cima) desapilar();
}
void Pila::apilar(int v)
{
Nodo nuevo;
nuevo = new Nodo(v, cima);
cima = nuevo;
}
int Pila::desapilar()
{
Nodo nodo;
int v;
if (!cima) return 0;
nodo = cima;
cima = nodo->siguiente;
v = nodo->valor;
delete nodo;
return v;
}
Nodo.h:
#ifndef NODO_H
#define NODO_H
#include "Pila.h"
class Nodo {
private:
int valor;
Nodo *siguiente;
friend class Pila;
public:
Nodo(int v, Nodo *sig);
};
#endif // NODO_H
Nodo.cpp:
#include "Nodo.h"
Nodo::Nodo(int v, Nodo *sig){
valor = v;
siguiente = sig;
};
我的程序的输出如下:error: 'Nodo' does not name a type,我认为它与include指令有关,但我不知道如何解决它.提前致谢。
编辑:我的错,没有指出错误是在哪一行代码中。它在 Pila.h 文件的第 8 行,Nodo cima;
【问题讨论】:
-
main包括Nodo.h。Nodo.h立即包含Pila.h。Pila.h立即包含Nodo.h,但您的包含守卫阻止它,它被跳过。当您第一次使用Nodo时,Nodo尚未被声明。如果您想了解我的意思,请了解如何使您的编译器产生预处理器输出。例如,对于 gcc,这是-E标志。 -
现在,正如所写,您的
Pila不需要包含在Nodo中。Nodo不需要知道Pila。通常,您包含的项目不需要知道包含它们的容器。问问自己,apple是否需要知道sack的存在才能成为苹果?当然不是。你的Nodo不需要知道Pila来做Nodo的所有必要的事情。