簡體   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