2016-04-06 8 views
0

Çok adımlı bir programım var ve programımın neden "Müşteriler" yazdığını anlayamıyorum (registerNewUser() işlevi) bildirilmemiş bir tanımlayıcıdır.C++ hata kodu C2065: '<class name>' bildirilmemiş tanımlayıcı, başka bir .h dosyasında bildirilmiş olsa bile

Ben de Müşteriler sınıf ile başlık dosyası (customers.h) dahil ettik

#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 

proc.h.

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 

kimse neyin yanlış olduğunu görebilir mi?

+0

Diğer başlıklarınızdaki #include korumalarını çözmediğinizi kontrol edin. Daha da iyisi, tüm ilgili olmayan başlıkları tamamen kaldırın. Ayrıca, ProTip ™: asla bir başlıkta 'namespace std;' komutunu kullanmayın. –

cevap

1

: Bu çizgiyi silmek için sadece denemek böylece müşteriler dahil, gerekli değildir (artı bunun için bir nokta). Yine de çok hoş değil.

NathanOliver'in, içerdiği sırayla ilgili bir sorun olabileceğini söylediği gibi, bunun yapılması gerekmiyor. Proc.h eklerseniz ilk önce her şey yolunda. Önce müşterileri eklerseniz, derleyici müşteri sınıfını görmeden önce proc.h içerir. proc daha sonra customers.h'yi dahil etmeyecektir (çünkü koruması onu engeller). Ardından, "Müşteri" nin ne anlama geldiğini bilmeden fonksiyonunuzu bulacaktır. Bu nedenle, başlık dosyalarınızın sırasına bağlı olarak işe yarayacaktır ya da olmayacaktır.

Bir ipucu istiyorsanız: Normalde ilk olarak yalnızca ileri bir bildirim için gerekli dosyaları ekledikten sonra ileri bir bildirim yapın. Sonra sınıfın tanımı için gerekli dosyaları dosyaları ekliyorum (Bunlar zaten sınıfın var olduğunu bilecek). Tüm sınıf bildirimi (üye işlev bildirimi ile birlikte) izler. Bunu böyle yaparsan birçok hatadan kurtulabilirsin. Sizin durumunuza:

#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 
3

Dairesel bir öğeniz var. customers.h içerir proc.h yüzden basiacally

void registerNewUser(Customers cBase); 

derleyici bir Customer ne gördü önce customers.h eklenmedi olacaktır. Görünüşe göre, #include "proc.h"'u customers.h'da kaldırabilmeniz ve derlemesi gerekir.

Yukarıdaki yorumlarda belirtildiği gibi, using namespace std; hiçbir zaman bir başlık dosyasında kullanmanız gereken hiçbir şey olarak şimdi tüm std ad alanının açıkta kalmasını sağlamalısınız. Ayrıca, en dar kapsamda kullanabileceğiniz veya tamamen bırakabileceğiniz alışkanlıklara da girmelisiniz. Eğer customers.h ve bu döngüsel bir başvuru neden olacaktır proc.h dahil customers.h dahil proc.h var ve proc.h benziyor: using namespace std; kullanımı ile ilgili daha geniş bilgi için Bu muhtemelen yineleniyor Why is “using namespace std” in C++ considered bad practice?

+0

Cevabınız için teşekkürler! Yine de, Müşteriler sınıfında kullandığım proc.h içinde bir işlevim var, bu yüzden gerçekten kaldıramıyorum. Başka bir çözüm var mı? Ayrıca, customer.h başka bir dosyadır. Buna customerS.h (ekstra s ile) denir ve customer.h için bir çeşit konteynır sınıfıdır. –

+0

@AndreasBH Evet.Bu işlevi 'proc.h''den kaldırır ve bunu bir cpp dosyasına (' proc.cpp'?) Ekler ve daha sonra bu cpp dosyasına 'customers.h' ve' proc.h' ekleyin. Genellikle üstbilgi dosyaları derleyicinin nesneler ve işlevlerden haberdar olmasını sağlayan bildirimleri içermeli ve cpp dosyalarının tanımları olmalıdır. – NathanOliver

+0

Evet, h dosyamda yalnızca bildirimler var ve cpp dosyam (aynı ada sahip) tanımlara sahipler. "#include proc.h", customer.h dosyasından kaldırmayı denedim, ancak yine de kimliği belirsiz bir tanımlayıcı hatası alıyorum. Bir ipucu? –

0

bkz Eğer bir bekçi beri, Temelde "customers.h" nde "customers.h" burada bir sorun olmaz dahil

#include "proc.h" 
İlgili konular