[英]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.