2013-09-24 36 views
7
Bir boş dosyasıdır Simpletron.cpp var

, bir Simpletron sınıf ilan eden bir Simpletron.h diyebilirsiniz:C Hiçbir uygulama ++ ama yine

class Simpletron 
{  
public: 
    Simpletron(); 
}; 

benim main.cpp içinde Simpletron() seslendi:

#include <iostream> 
#include "Simpletron.h" 

int main(int argc, char *argv[]) 
{ 

    Simpletron s(); 
    std::cin.get(); 
} 

Ana işlev, herhangi bir uyarı veya hata olmadan sorunsuz bir şekilde çalışır. Neden? Başlık dosyasının bağlanabileceği bir uygulama yoksa bu nasıl derlenir?

+4

@ Smac89: Bildirdiğinizde değil. Belki deliriyorum ama en az 7 kişi de yanlış. Bu program bir linker hatasına neden olmalıdır, [example] (http://ideone.com/5m0ygK). – GManNickG

+0

@octef: Lütfen gerçek kodunuzu ve komut satırınızı belirtin. Örneğin, sınıf tanımınız sonra noktalı virgül eksik, bu yüzden derleme kod olamaz. – GManNickG

+0

Elbette, bir dakika bekle. – octref

cevap

24

Bu hat:

Simpletron s(); 

, s adında bir işlev ilan eden bir Simpletron dönen ve argüman almayan bir fonksiyon prototipidir. s adında bir Simpletron örneği oluşturmaz.

Şimdi bunu sorabilirsiniz, neden linker var olmayan s() işlevinden şikayet etmiyor? Eh, sadece s() ilan ama asla aslında arama, aslında bağlantı sırasında herhangi bir yerde başvurulan, bu yüzden hiçbir bağlantı hatası olsun.

13
Simpletron s(); 

Bu, nesne bildirimi değil, işlev bildirimidir. Boş parantez derleyiciye bu işlevin argüman almadığını ve Simpletron türünde bir nesneyi değere döndürdüğünü söyler, bu nedenle kurucu çağrılmaz. Doğru sözdizimi parametreleri olmadan geçerli:

Simpletron s; // You will get an error on this line, as initially expected 

C++ 11 Bu belirsizlikten kaçınır sözdizimsel özellik ekler:

Simpletron s{}; // same as default-initialization 
+0

"Düzelt", bağlantı zamanı hatasına neden oluyor demektir. –

+0

Düzeltmez. Bu bir hata olur. – MahanGM

+4

@MahanGM: "Düzelt", kodun _to bekleniyormuş gibi davranması anlamına gelir. –

5
Simpletron s(); 

Bu "eziyetli parse" klasik bir durumdur; derleyici için s türünde Simpletron türünde bir değişken oluşturmuyorsunuz, ancak hiçbir parametre almadan ve Simpletron nesnesini döndürerek s adlı bir işlevi bildiriyorsunuz. Bu, bu ifadenin hem bir işlev bildirgesi hem de bir değişken bildirim olarak yorumlanabilmesi gerçeğinden kaynaklanmaktadır; Değişkeni bildirmek için kolay bir alternatif var (yani, parantezleri atlayın), standart bunu bir işlev bildirgesi olarak yorumlamak için yetkilendirir.

Bu sorunsuz derleme aşamasını geçer (derleyici tanımlarını tüm yöntemlerin, sadece beyanlar olması gerekmez) ve Simpletron hiçbir örnek olduğundan muhtemelen bağlayıcı herhangi bir hata vermez aslında oluşturuldu, bu yüzden hiçbir zaman yapıcı tanımını aramaya gerek yok (ben garantili hata vermemek gerektiğini düşünmüyorum, özellikle kapsamlı bir derleyici/linker çift eksik yapıcı için bir hata vermek mümkün olmalıdır Neyse).

İlgili konular