我有一个多文件程序,我无法弄清楚为什么我的程序会说"客户" (在registerNewUser()函数中)是未声明的标识符。
proc.h
#ifndef PROC_H
#define PROC_H
#include <iostream>
#include "const.h"
#include "customers.h"
#include <fstream>
using namespace std;
void registerNewUser(Customers cBase); // Add new user.
#endif // !PROC_H
我已将头文件(customers.h)包含在Customers类中。
customers.h
#ifndef CUSTOMERS_H
#define CUSTOMERS_H
#include <iostream>
#include "const.h"
#include "proc.h"
#include "customer.h"
using namespace std;
class Customers {
private:
char* current;
List* customerList; // List for customers.
public:
Customers(); // Constructor.
~Customers(); // Destructor.
void handler(); // Customers handler/menu.
void addNew(char username[]);
};
#endif // !CUSTOMERS_H
任何人都可以看到错误吗?
答案 0 :(得分:4)
你有一个循环包含。 customers.h
包括proc.h
如此基本
void registerNewUser(Customers cBase);
在编译器看到Customer
之前,会添加到customers.h。看起来你应该只能删除#include "proc.h"
中的customers.h
并且它应该编译。
如上面的评论中所述,您不应在头文件中使用using namespace std;
,因为包含它的任何内容现在都会暴露整个std命名空间。你也应养成只在最窄范围内使用它或完全放弃它的习惯。有关使用using namespace std;
的进一步阅读,请参阅Why is “using namespace std” in C++ considered bad practice?
答案 1 :(得分:1)
基本上包括“customers.h”中的“customers.h”在这里不会有问题,因为你有一个警卫(加点)。然而它并不是很好。
正如NathanOliver所说,它可能是包含顺序的一个问题,但它没有必要。如果你包括proc.h首先一切都很好。如果首先包含客户,则编译器在看到客户类之前包含proc.h。 proc然后不会包括customers.h(因为它的后卫阻止它)。然后他会发现你的功能不知道“顾客”是什么意思。因此,根据头文件的包含顺序,它将会或不会工作。
如果您需要提示:我通常首先只包含前向声明所需的文件,然后进行前向声明。然后我包含文件所需的文件来定义类(这些已经知道该类存在)。完整的类声明(带成员函数声明)如下。如果你这样做,你可以避免许多错误。在你的情况下:
#ifndef CUSTOMERS_H
#define CUSTOMERS_H
class Customers;
#include "proc.h"
#include "ListTool2B.H"
using namespace std;
class Customers
{
private:
char* current;
List* customerList; // List for customers.
public:
Customers(); // Constructor.
~Customers(); // Destructor.
void handler(); // Customers handler/menu.
void addNew(char username[]);
};
#endif
答案 2 :(得分:0)
这可能是重复的:你有proc.h包括customers.h和customers.h包括proc.h这会导致循环引用,看起来像proc.h包含在客户中是没有必要的,所以你可以试试只需删除此行:
#include "proc.h"