我的問題與Johannes在Is there a way to instantiate objects from a string holding their class name?的回答以及Spencer Rose最近的評論相對應。由於我無法在那裏添加評論,因此我決定發起一個新問題。使用模板進行自我註冊的C++工廠模式
Johannes的建議是我所需要的。我以完全相同的方式實現它,但使用VS2008時出現無法解析的外部符號鏈接器錯誤,這似乎與地圖有關。我試圖解決這個問題。今天我讀了Spencer的評論,並添加了他建議的行
BaseFactory::map_type BaseFactory::map = new map_type();
到Base.hpp。現在,我得到一個錯誤LNK2005
Derivedb.obj : error LNK2005:
"private: static class std::map<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class Base * (__cdecl*)(void),struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const ,class Base * (__cdecl*)(void)> > > * BaseFactory::map"
([email protected]@@[email protected][email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected][email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@@[email protected][email protected][email protected][email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@@@[email protected]@[email protected]@A)
already defined in Switcher.obj
Project.exe : fatal error LNK1169: one or more multiply defined symbols found)
代替LNK2001錯誤
(Switcher.obj : error LNK2001: unresolved external symbol "private: static class std::map<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class Base * (__cdecl*)(void),struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const ,class Base * (__cdecl*)(void)> > > * BaseFactory::map" ([email protected]@@[email protected][email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected][email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@@[email protected][email protected][email protected][email protected][email protected]@st[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@@@[email protected]@[email protected]@A)
1>Derivedb.obj : error LNK2001: unresolved external symbol "private: static class std::map<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class Base * (__cdecl*)(void),struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const ,class Base * (__cdecl*)(void)> > > * BaseFactory::map" ([email protected]@@[email protected][email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected][email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@@[email protected][email protected][email protected][email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@@@[email protected]@[email protected]@A)
1>Project.exe : fatal error LNK1120: 1 unresolved externals)
這意味着我可能已經兩次將它定義? 請斯賓塞或其他人發佈改進的base.hpp代碼。這是一個非常重要的解決方案,它肯定會對更多新手C++程序員有所幫助。
第二個問題: - >這個問題解決了!謝謝!
我需要在base.hpp中的一些函數聲明。這些應該在基類中是抽象的並在子類中實現(例如Derivedb.cpp)。但是
public:
virtual ReadInFile(std::string path, std::string filename) = 0;
在base.hpp中給出了編譯器錯誤。刪除「= 0」解決了編譯器錯誤。但現在我有另一種解析外部符號LNK2001錯誤
Derivedb.obj: error LNK2001: unresolved external symbol
"public: virtual __thiscall Base::ReadInFile(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)"
([email protected]@@[email protected]@[email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]).
我把它在另一個CPP文件
Base* importer = BaseFactory::createInstance("DerivedB");
importer->ReadInFile(m_path, m_filename);
也許並不清楚其功能(基地或子類)需要被調用,因爲它是不在基類中抽象?有沒有解決這個問題的方法?謝謝!
錯誤並不意味着「某些東西」是錯誤的。錯誤通常具有特定的消息,並且在編譯器錯誤的情況下,一行指示問題的位置。你收到什麼錯誤信息?你說你有一個純虛函數時會出現編譯錯誤。那個編譯器錯誤是關於嘗試實例化一個具有純虛函數的類嗎?總之:你得到了什麼_messages_? –
感謝您的評論!現在我試着再次通過添加「= 0」來得到錯誤,並且編譯器錯誤沒有出現,此外LNK2001錯誤消失了。我嘗試了很多東西,現在我不知道原因是什麼。它確實告訴我,抽象方法是不允許的。無論如何,我很高興你的評論,因爲現在至少這個錯誤已經解決:-)。我仍然有LNK2005錯誤。 – Natalie
現在你已經過去了第一個錯誤,你可以[編輯]你的問題。另外,編譯器錯誤通常很具體,但重要的細節有時可能會丟失。如果在編輯問題時包含* exact *編譯器錯誤,您會得到更好的幫助。 –