2016-04-07 13 views
1

Ara bağlantı nedenleriyle birbirleri için işaretçiler içeren C++ sınıfında bir dizi dersim var. kod aşağıdaki gibidir:Birbirlerine İşaretçi İçeren Sınıfları Tanımlama

class Cell; 

//classes 
class Connection { 
public: 
    Cell * source; 

    virtual bool trigger() { 
     return source->trigger(); //line 16, source of the error 
    } 

    //constructors 
    //default 
    Connection() { 
     source = NULL; 
    } 

    //call 
    Connection(Cell * in) { 
     source = in; 
    } 

    //copy 
    Connection(const Connection & in) { 
     source = in.source; 
    } 
}; 

class NotConnection : Connection { 
public: 
    virtual bool trigger() override { 
     return !source->trigger(); 
    } 

    //constructors 
    //default 
    NotConnection() { 
     source = NULL; 
    } 

    //call 
    NotConnection(Cell * in) { 
     source = in; 
    } 

    //copy 
    NotConnection(const NotConnection & in) { 
     source = in.source; 
    } 
}; 


class Cell { 
public: 
    vector<Connection *> parents; 

    virtual bool trigger() = 0; 

    ~Cell() { 
     for (int i = 0; i < parents.size(); i++) { 
      delete parents[i]; 
     } 
    } 
}; 

Ben herhangi derleme sorunları temizlemek için deklarasyon ileri kullanabileceğini düşündüm ama proje oluşturma girişiminde hata alıyorum: Ben ayırd edici güc çalıştı

source.cpp(16): error C2027: use of undefined type 'Cell' 

sınıfları sıralamak ve bunun yerine Connection bildirmek ve bu da işe yaramadı, benim sorum, derleyicinin bu hatayı neden attığını ve bunu çözmek için ne yapabilirim?

+0

Um ... hat 16 hangisi? – Brian

+0

Hangi hattın 16 olduğunu göstermek için bir yorum ekledim – Stephen

cevap

1

Henüz tanımlanmamış bir sınıfın üyesine erişemiyorsunuz, çünkü derleyici henüz sınıfın üyelerini tanımıyor.

Önce trigger bildirmeli ve ardından Cell tanımı görüldükten sonra tanımlamanız gerekir.

class Cell; 

class Connection { 
public: 
    Cell * source;  
    virtual bool trigger(); 
}; 

class Cell { 
    // definition of Cell 
}; 

inline bool Connection::trigger() { 
    return source->trigger(); 
} 
+0

Tüm sınıfları önce prototip olarak tanımlamak ve sonradan bu hatadan kaçınmak için uygulamaları daha sonra yazmak için iyi bir kural olarak kabul edildi mi? – Stephen

0

İşaretçileri veya başvuruları bildirirken ileri bildirilen sınıfları kullanabilirsiniz, ancak bu türleri gerçekten kullanamazsınız.

bir .cpp dosyaya connection::trigger() uygulanmasını taşıyın veya cell grubun tanımına sonra inline olarak tanımlamak

.