2008-10-06 23 views
22

Varsayılan olarak, C++ 'da, bir tek argüman kurucu, örtük bir dönüşüm işleci olarak kullanılabilir. Bu, kurucuyu açık olarak işaretleyerek bastırılabilir.Tek bağımsız değişken kurucular C++ 'da açık olarak zorlanıyor mu?

"Açıkça" varsayılanı oluşturmayı tercih ederim, böylece derleyici bu kurucuları dönüşüm için sessizce kullanamaz.

Bunu standart C++'da yapmanın bir yolu var mı? Başarısız, bunu yapmak için Microsoft C++ içinde çalışacak bir pragma (veya benzer) var mı? Ya g ++ (kullanmıyoruz, ama yararlı bilgiler olabilir)?

cevap

17

Hayır, her şeyi el ile yapmanız gerekir. Bu bir acı, ama kesinlikle tek argüman kurucuları açık yapma alışkanlığına girmelisin. Bir çözüm bulursanız ve ardından kodu başka bir platforma taşımanız gerektiğinde sahip olabileceğiniz acıyı hayal edemiyorum. Kodun daha az taşınabilir olmasını sağlayacağından, genellikle derleyici uzantılarından uzak durmalısınız.

+1

Dürüst olmak gerekirse, çok fazla taşınabilirlikten rahatsız değiliz; Biz bir Windows mağazasıyız. Bu, umursamadığımızı ima etmek anlamına gelmez; Bu, Win32 GUI çerçevesini seçtikten sonra Linux veya OSX'i desteklemenin akademik olduğu anlamına gelir. –

+1

Taşınabilirlik sadece bir platform sorunu değildir. Pencereler için başka derleyiciler de vardır. Intel, MinGW. Microsoft'un derleyicisinin yeni sürümlerinde geriye dönük uyumluluk da vardır. Sahip olduğunuz tek garanti, C++ Komitesinin mevcut C++ kodunu kırmadan önce çok dikkatli bir şekilde düşünmesidir. –

+0

Sadece açıklığa kavuşmak gerekirse, Microsoft'un insanların kodlarını düşünmeden koparacağını önermiyorum, ancak standart komitesinin farklı baskıları var. –

0

Sanırım cevap hayır!

Üzgünüz, bu çok yapıcı bir cevap değil. Umarım başka biri daha fazlasını bilir!

0

Standart C++'de böyle bir seçenek yoktur ve Visual Studio'da da yoktur.

1

Sahip olduğunuz herhangi bir başlık için oldukça kötü olabilir. <vector> veya Boost başlıklarından herhangi biri gibi. Ayrıca, birkaç yanlış hata bildirimine de neden olur. Yani, hayır, bir derleyicinin böyle bir #pragma eklemesini beklemiyorum.

1

Oluşturucuları varsayılan olarak açık yapan bir pragma veya komut satırı seçeneği varsa, açık olmayan birini nasıl bildirirsiniz? Bir örtük dönüştürme kurucusunun bildirilmesini mümkün kılmak için başka bir derleyici özel belirteç veya pragma olması gerekir.

+1

Bunu beğendim. Raymond Chen'in rethorical silahlarından biri. “Bunu yapabilir miyim? Peki, düşünebilirsin * yapabilirsin, sonra…” –

+1

Söylediklerimi alırım. Bir komut satırı seçeneği ile, bu doğru olurdu. Bir pragma ile daha sonra kapatabilirsin. Veya MSVC ile, geçerli sınıfa sınırlı olabilen __pragma veya __declspec uzantılarını kullanabilirsiniz (c.f. __declspec (novtable)). –

İlgili konular