2014-08-27 21 views
15

Bir şeye referans getiren bir sınıf yöntemim var. Bu yöntemi kullandığımda, yalnızca bir şeyin ileri bir bildirimi varsa, yalnızca yöntemin çıktısını atarsam derleyebilirim.Gelecek bildirilen bir türe (C++) başvuru döndürme

ClassA.h:

//Forward declare 
class ClassB; 

class ClassA 
{ 
public: 
    ClassA(void); 
    ~ClassA(void); 

    ClassB& Func(); 
}; 

ClassA.cpp:

#include "ClassA.h" 

#include "ClassB.h" 

ClassA::ClassA(void) 
{} 

ClassA::~ClassA(void) 
{} 

static ClassB c; 

ClassB& ClassA::Func() 
{ 
    return c; 
} 

Gerçekten İşte

basitleştirilmiş örnek ... neden anlamıyorum ClassB.h:

Ben (sadece ClassB bir ileri beyanı yerken) dönüş değeri atamadan ClassA::Func ararsanız Şimdi
#pragma once 
class ClassB 
{ 
public: 
    ClassB(void) {}; 
    ~ClassB(void) {}; 
}; 

, bu derleme olmaz:

main.cpp:

#include "ClassA.h" 

int main(void) 
{ 
    ClassA a; 

    a.Func(); //error C2027: use of undefined type 'ClassB' 

    return 0; 
} 

Bunun yerine bu satırı kullanırsam, şu işe yarar: ClassB& b = a.Func();

Burada neler oluyor? Derleyicinin neden ClassB boyutunu bilmesi veya geri dönüş değeri herhangi bir yere atanmadığında yöntemleri nedir?

Bunu VisualStudio 2010 SP1 ile derliyorum.

+6

Derleyicinin, herhangi bir şeye bağlamazsanız referansı atlayabilmesi için derleyicinin 'ClassB' hakkında bir şey bilmesi için bir neden olmadığını söyleyen bir derleyici hatası gibi görünüyor. –

+0

VS2012'de de çoğaltabilir. – dlf

+0

Hem hata ayıklamada hem de sürümde mi? 2012 yılında – quantdev

cevap

5

, derleyici bir "sınırlama" gibi the MSDN page for C2027 says görünüyor:

ilan ancak tanımlanmamış tip bir işaretçi bildirmek mümkündür. Ancak Visual C++, tanımlanmamış bir türe bir başvuruya izin vermiyor.

Aşağıdaki örnek C2027'yi üretir. İkinci, öyle değil (yani daha fazla belge olmadan, yok neden emin değilim, bir C2027 yaratması gerekmektedir yüzden örneklerinden ikisi

class A; 
A& CreateA(); 

class B; 
B* CreateB(); 

int main() { 
    CreateA(); // C2027 
    CreateB(); // OK 
} 

:

Ve

bu örnek verir bir hata)

+0

Bunun dışında, dönüş değeri atandığında hata giderileceği açıktır. ?? – dlf

+0

@dlf Neden ikinci bir hata oluşturmaz, ancak OP kodu, bir hata veren MSDN örneğine benzer. – quantdev

+0

Katılıyorum.Ya belgelerinin yanlış (eksik), ya da diğer durumun çalıştığı gerçeği, belgenin istememesi gereken standardı takip etmesi bakımından bir "hata" dır. – dlf