Dostęp do statycznego pola.

Dostęp do statycznego pola.
patryj1083
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 6 lat
  • Postów:102
0

Witam,
w jaki sposób mógłbym się dostać do tego pola?

Kopiuj
 static std::array<std::vector<Raport*>, static_cast<size_t>(ErrorLevel::Count)> mLog;

Próbuję zrobić coś na wzór "wewnętrznego singletona".

Kopiuj
//LogRaport.hpp
class LogRaport : public TISingleton<LogRaport>
{
public:
          .......
	static void push(Raport raport, ErrorLevel level = ErrorLevel::Error);
          .......
	std::vector<Raport*>& operator()(const ErrorLevel &level);

private:
	static std::array<std::vector<Raport*>, static_cast<size_t>(ErrorLevel::Count)> mLog;
}; 
//LogRaport.cpp
void LogRaport::push(Raport raport, ErrorLevel level)
{
	instance->mLog[static_cast<size_t>(level)].push_back(&raport);
}
Kopiuj
//TISingleton.hpp
using std::call_once;
using std::once_flag;

template<class T>
class TISingleton
{
protected:
	explicit TISingleton<T>() {}
	~TISingleton<T>() {}

protected:
	static std::unique_ptr<T> instance;
	static once_flag& get_once_flag() {
		static once_flag once_;
		return once_;
	}
};

template<class T> std::unique_ptr<T> TISingleton<T>::instance = nullptr;

W jaki sposób mogę to poprawić ?

Edit: Otrzymuję taki błąd

Kopiuj
Error	LNK2001	unresolved external symbol "public: static class std::array<class std::vector<struct Raport *,class std::allocator<struct Raport *> >,3> LogRaport::mLog" (?mLog@LogRaport@@2V?$array@V?$vector@PAURaport@@V?$allocator@PAURaport@@@std@@@std@@$02@std@@A)	
edytowany 1x, ostatnio: patryj1083
twonek
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 2 lata
  • Postów:2500
1

Pola statyczne trzeba inicjalizować, więc dodaj taką linię w pliku .cpp:

Kopiuj
std::array<std::vector<Raport*>, static_cast<size_t>(ErrorLevel::Count)> LogRaport::mLog;
edytowany 2x, ostatnio: twonek
sidmas
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 6 lat
  • Lokalizacja:Zielona Góra
  • Postów:13
0

używaj przestrzeni nazw using namespace std;

mwl4
Co to ma do rzeczy?
carlosmay
A to dlaczego? Nie używając zmniejszamy ryzyko wystąpienia konfliktów identyfikatorów. Ba. Nawet zaleca się aby swój kod pakować w swoją przestrzeń nazw.
JU
  • Rejestracja:około 22 lata
  • Ostatnio:3 miesiące
  • Postów:5042
2
sidmas napisał(a):

używaj przestrzeni nazw using namespace std;

Nie, nie używaj tego. A tym bardziej w pliku h.

sidmas
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 6 lat
  • Lokalizacja:Zielona Góra
  • Postów:13
0

Głównie chodziło mi o to żebyś nie musiał pisać std cały czas natomiast przedmówcy mają racje. Sorki za wprowadzenie w błąd

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.