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

时间:2016-04-06 11:47:08

标签: c++ class identifier

我有一个多文件程序,我无法弄清楚为什么我的程序会说&#34;客户&#34; (在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

任何人都可以看到错误吗?

3 个答案:

答案 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"