c ++ Как достичь такой структуры классов?

Я ломаю голову, пытаясь понять, как писать кроссплатформенные классы, избегая при этом стоимости виртуальных функций и любых уродств в версиях классов для конкретных платформ. Вот что я пробовал.

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

Как мне правильно создать такой дизайн? Или это просто ужасная идея. Я пытался узнать, как писать кросс-платформенные классы, но я просто получаю массу результатов о кросс-платформенных библиотеках, любая помощь будет с благодарностью принята :)

5
задан Cœur 2 May 2017 в 13:10
поделиться