2015-10-21 10 views
7

Próbuję utworzyć klasę z leniwymi obliczeniami. Tak więc potrzebuję struct do przechowywania wcześniej obliczonych zmiennych i chcę umieścić tę klasę w nienazwanej przestrzeni nazw (nie chcę zanieczyszczać globalnego zasięgu). Oto minimalne kod, który wyjaśnia, co chcę: calculator.h:Jak przesłać dalej deklaruj klasę, która znajduje się w nienazwanej przestrzeni nazw

#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(); 
} 

Oczywiście daje błąd expected type-specifier before 'PrevCalc' i gdybym określić PrevCalc bez nazw wszystko działa poprawnie. Moje pytanie brzmi: w jaki sposób zadeklarować klasy, które będą zdefiniowane w przestrzeni nazw bezimiennego w .cpp pliku

+2

anonimowy nazw w nagłówku jest z pewnością zły projekt. –

+1

Anonimowe przestrzenie nazw są ** przeznaczone **, aby ograniczyć zakres do zakresu pliku. Nazwana przestrzeń nazw może lepiej pasować do twoich potrzeb. – Downvoter

+6

Dlaczego nie uczynić 'PrevCalc' zagnieżdżoną strukturą' Kalkulatora'? Nie trzeba wtedy dynamicznie przydzielać go. –

Odpowiedz

5

moje pytanie brzmi: w jaki sposób zadeklarować klasy, które będą zdefiniowane w przestrzeni nazw bezimiennego w .cpp pliku

Nie możesz. Nienazwana przestrzeń nazw jest jawnie przeznaczona do prywatnej widoczności dla bieżącej jednostki tłumaczeniowej, w której się pojawia, i nie może być używana z wewnętrznymi deklaracjami forward.

Prawdopodobnie lepiej jest użyć numeru pimpl idiom, jeśli chcesz ukryć szczegóły implementacji.


Innym popularnym podejście używa nazw internal_, i udokumentować to nie oznaczało dla public użycia:

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

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

Problem polega na tym, że tylko anonimowy obszar nazw daje ci wewnętrzny związek. To jest dość smutne, nie ma sposobu, aby swobodnie używać całkowicie wewnętrznego członka klasy (lub funkcji członka) bez hacków. Hope Modules to poprawi! Przynajmniej będziemy mieli wewnętrzne klasy modułów i tak dalej. – user362515

Powiązane problemy