C ++错误代码C2065:' '未声明的标识符,即使它应该在另一个.h文件中声明

问题描述 投票:0回答:3

我有一个多文件程序,我无法弄清楚为什么我的程序说“Customers”(在寄存器User()函数中)是一个未声明的标识符。

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

任何人都可以看到什么是错的?

c++ class identifier
3个回答
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

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?


0
投票

这可能是一个重复:你有proc.h包括customers.h和customers.h包括proc.h这将导致循环引用,看起来像客户中包含的proc.h是没有必要的,所以你可以尝试简单地删除这一行:

#include "proc.h"
© www.soinside.com 2019 - 2024. All rights reserved.