Я ломаю голову, пытаясь выяснить, как писать кроссплатформенные классы, избегая при этом стоимости виртуальных функций и любого рода уродства в версиях классов, специфичных для платформы.Вот что я попробовал.
PlatformIndependantClass.hpp
class PlatformIndependantClass {
public:
PlatformIndependantClass();
std::string GetPlatformName();
private:
PlatformIndependantClass* mImplementation;
};
LinuxClass.hpp
#include "PlatformIndependantClass.hpp"
class LinuxClass : public PlatformIndependantClass{
public:
std::string GetPlatformName();
};
WindowsClass.hpp
#include "PlatformIndependantClass.hpp"
class WindowsClass : public PlatformIndependantClass {
public:
std::string GetPlatformName();
};
PlatformIndependantClass.cpp
#include "PlatformIndependantClass.hpp"
#include "LinuxClass.hpp"
#include "WindowsClass.hpp"
PlatformIndependantClass::PlatformIndependantClass() {
#ifdef TARGET_LINUX
mImplementation = new LinuxClass();
#endif
#ifdef TARGET_WINDOWS
mImplementation = new WindowsClass();
#endif
}
std::string PlatformIndependantClass::GetPlatformName() {
return mImplementation->GetPlatformName();
}
LinuxClass.cpp
#include "LinuxClass.hpp"
std::string LinuxClass::GetPlatformName() {
return std::string("This was compiled on linux!");
}
WindowsClass.cpp
#include "WindowsClass.hpp"
std::string WindowsClass::GetPlatformName() {
return std::string("This was compiled on windows!");
}
main.cpp
#include <iostream>
#include "PlatformIndependantClass.hpp"
using namespace std;
int main()
{
PlatformIndependantClass* cl = new PlatformIndependantClass();
cout << "Hello world!" << endl;
cout << "Operating system name is: " << cl->GetPlatformName() << endl;
cout << "Bye!" << endl;
return 0;
}
Теперь, это скомпилируется нормально, но я получаю ошибку сегментации,Я считаю, что это потому, что классы, специфичные для платформы, наследуются от PlatformIndependantClass, который при создании создает экземпляр класса, специфичного для платформы, поэтому я получаю бесконечную рекурсию.Каждый раз, когда я пытаюсь, я просто запутываюсь!
Как мне добиться такого дизайна?Или это просто ужасная идея.Я пытался выяснить, как писать кроссплатформенные классы, но я просто получаю кучу результатов о кроссплатформенных библиотеках, любая помощь будет с благодарностью принята:)