2015-10-21 21 views
7

Tembel hesaplamalar yaparak sınıf oluşturmaya çalışıyorum. Bu yüzden önceden hesaplanmış değişkenleri tutmak için yapıya ihtiyacım var ve bu sınıfı isimsiz isim alanına koymak istiyorum (global kapsamı kirletmek istemiyorum). İşte ne istiyorum açıklayan asgari kodudur: calculator.h:Adlandırılmamış ad alanında bulunan sınıf bildirimi nasıl iletilir

#ifndef CALCULATOR_H 
#define CALCULATOR_H 

class PrevCalc; 
class Calculator 
{ 
public: 
    Calculator(); 
    PrevCalc* prevCalc; 
}; 

#endif // CALCULATOR_H 

calculator.cpp:

#include "calculator.h" 
namespace{ 
    struct PrevCalc{ 
     double prevA = -1; 
     double prevB = -1; 
     double prevC = -1; 
    }; 
} 
Calculator::Calculator() 
{ 
    prevCalc = new PrevCalc(); 
} 

Tabii ki bir hata expected type-specifier before 'PrevCalc' verir ve ben ad olmadan PrevCalc tanımlarsanız her şey çalışıyor. Sorum

+2

Anonim ad kesinlikle yanlış bir tasarımdır. –

+1

Anonim ad alanları, kapsamı dosya kapsamıyla sınırlandırmak için ** amaçlanmıştır **. Adlandırılmış bir ad alanı, gereksinimlerinize daha iyi uyabilir. – Downvoter

+6

Neden 'PrevCalc'' Hesap makinesinin iç içe geçmiş yapısını yapmıyorsunuz? Bunu dinamik olarak ayırmanız gerekmeyecek. –

cevap

5

Sorum .cpp dosyası

Yapamazsın içinde isimsiz ad alanında tanımlanmış olacaktır sınıf bildirmek için nasıl .cpp dosyada adı açıklanmayan ad alanında tanımlanmış olacaktır sınıf bildirmek için nasıl. Adsız ad alanı, içinde görüntülendiği geçerli çeviri birimi için özel olarak görünür olması ve ileriye dönük bildirimler için doğal olarak kullanılamayacağı anlamına gelir.

Uygulama ayrıntılarını gizlemek istiyorsanız, pimpl idiom'u kullanmanız daha iyi olacaktır.


diğer popüler yaklaşım internal_ ad kullanarak ve public kullanım için tasarlanmadığı belgelemek: a başlığında

namespace calculators { 
namespace internal_ { 
    struct PrevCalc{ 
     double prevA = -1; 
     double prevB = -1; 
     double prevC = -1; 
    }; 
} 

class Calculator { 
public: 
    Calculator(); 
private: // !!!! 
    internal_::PrevCalc* prevCalc; 
}; 
} 
+0

Sorun, sadece anonim bir ad alanı size iç bağlantı sağlar. Oldukça üzgün, tamamen dahili bir sınıf üyesi (veya üye işlevi) hack olmadan serbestçe kullanmanın bir yolu yoktur. Umut Modülleri bunu geliştirecek! En azından modül-iç sınıflarımız olacak ve değil. – user362515

İlgili konular