2009-06-20 18 views
120

Olası Çoğalt:
Forward declaration of nested types/classes in C++Bir iç sınıf bildirmeyi nasıl yönlendirebilirim?

Ben referans ile bir Konteyner :: yineleyici geçmek istiyorum, başka yerde ... Bir sınıf şöyle

class Container { 
public: 
    class Iterator { 
     ... 
    }; 

    ... 
}; 

var ancak başlık dosyasını eklemek istemiyorum. Sınıfı bildirmeyi denerseniz, derleme hataları alıyorum.

class Container::Iterator; 

class Foo { 
    void Read(Container::Iterator& it); 
}; 

Ben Yineleyici sınıf beyan dosyasının eklenmesinin zorunda kalmamak

test.h:3: error: ‘Iterator’ in class ‘Container’ does not name a type 
test.h:5: error: variable or field ‘Foo’ declared void 
test.h:5: error: incomplete type ‘Container’ used in nested name specifier 
test.h:5: error: ‘it’ was not declared in this scope 

nasıl ileriye bu sınıfı ilan edebilir ... Yukarıdaki kod verir Derleme?

cevap

102

Bu sadece mümkün değildir. İç içe geçmiş bir yapıyı kabın dışında bildiremezsiniz. Bunu yalnızca kabın içinde bildirebilirsiniz.

Sen iç içe sınıf tam

  • aynı temel sınıfa oluştur ilk tanımlandığı şekilde
  • senin beyanı sırasını değiştirme sınıf olmayan iç içe olun şu

    • birini yapmanız gerekir Bu işlevde hem kullanılabilir hem de iç içe geçmiş sınıf tarafından uygulanabilir. Ben eksik bir sınıf çalışmalarına iç sınıfını bildirerek ileri inanmıyorum
  • +2

    Ortak taban sınıfı, en sonunda benim için kullanılan çözümdür. – Coyote

    +0

    İsterseniz arkadaşınızı bu konuda çalışmak için kullanabilirsiniz. –

    +1

    Bu yanlış: http: //en.cppreference.com/w/cpp/language/nested_types – Nikerboker

    18

    (aslında bir iç sınıf varsa çünkü sınıf tanımının olmadan bilmenin bir yolu yoktur).

    class Container::Iterator { 
    }; 
    

    Sonra #include sadece:

    class Container { 
    public: 
        class Iterator; 
    }; 
    

    Sonra ayrı bir başlıkta, Konteyner :: yineleyici uygulamak: Yani bir ileri ilan iç sınıfıyla, Konteyner tanımını içerecek gerekecek kap başlığı (veya ilan etme konusundaki ileri endişe ve sadece ikisi dahil değildir)

    +4

    İlk parantez parantezindeki bölüm hariç, iyi bir yanıt. “İçsel bir sınıfın olup olmadığını bilmenin bir yolu yoktur” bu bağlamda mantıklı değildir ve doğru olması şüphelidir. İleriye dönük beyanın bütün noktası, derleyiciye bir sınıf (ya da bu durumda bir iç sınıf) olduğunu söylemenizdir. Bu özel ifadeniz, normal sınıflar kadar doğru olacak ve herhangi bir şeyi beyan edemeyeceğiniz anlamına gelecektir. – Aaron

    1

    ne istediğini tam olarak yapmak için hiçbir yol biliyorum ama burada şablonları kullanmak isteyen varsa geçici bir çözüm şöyledir:

    );
    #include "Foo.h" 
    int main() 
    { 
        Foo f; 
        Container::Inner i; 
        f.Read(i); // ok 
        f.Read(3); // error 
    } 
    

    // Foo.cpp 
    #include "Foo.h" 
    #include "Container.h" 
    /* 
    struct Container 
    { 
        struct Inner { }; 
    }; 
    */ 
    export template<> 
        void Foo::Read<Container::Inner>(Container::Inner& it) 
    { 
    
    } 
    
    // Foo.h 
    struct Foo 
    { 
        export template<class T> void Read(T it); 
    }; 
    
    Umarım, bu deyim (umarım derleyici EDG tabanlı ve ihracat uygular ve) size bazı kullanım olabilir.

    İlgili konular