繁体   English   中英

C ++错误代码C2065:“ <class name> &#39;未声明的标识符,即使应在另一个.h文件中声明

[英]C++ error code C2065: '<class name>' undeclared identifier, even though it should be declared in another .h-file

我有一个多文件程序,但我不知道为什么我的程序说“ Customers”(在registerNewUser()函数中)是未声明的标识符。

进程

#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)包含在客户类中。

客户.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

谁能看到什么问题?

您有一个循环包含。 customers.h包括proc.h所以basiacally

void registerNewUser(Customers cBase);

在编译器了解Customer是什么之前,将其添加到customers.h。 它看起来像你应该能够删除#include "proc.h"customers.h ,它应该编译。

如以上注释中所述,您永远不应using namespace std; 在头文件中,因为包含它的所有内容现在都暴露了整个std名称空间。 您还应该养成只在可能的最窄范围内使用它或完全放弃它的习惯。 有关using namespace std;的用法的进一步阅读using namespace std; 请参见为什么在C ++中“使用命名空间标准”被认为是不良做法?

基本上,在“ 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

这可能是重复的:您拥有包含customer.h的proc.h和包含proc.h的customers.h,这将导致循环引用,并且看起来没有必要包含在客户中的proc.h,因此您可以尝试删除这行:

#include "proc.h"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM