Я ломаю голову, пытаясь понять, как писать кроссплатформенные классы, избегая при этом стоимости виртуальных функций и любых уродств в версиях классов для конкретных платформ. Вот что я пробовал.
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, который при построении создает экземпляр класса, специфичного для платформы, поэтому я получаю бесконечную рекурсию. Каждый раз, когда я пытаюсь, я просто очень запутываюсь!
Как мне правильно создать такой дизайн? Или это просто ужасная идея. Я пытался узнать, как писать кросс-платформенные классы, но я просто получаю массу результатов о кросс-платформенных библиотеках, любая помощь будет с благодарностью принята :)