Oczywiście wiem, że najlepszą odpowiedzią jest "nie pisanie własnego kodu między platformami, ktoś już zrobił to, czego potrzebujesz", ale robię to jako hobby/uczenie się wykonywania, a nie w żadnej opłaconej zdolności. Zasadniczo piszę niewielką aplikację konsolową w C++ i chciałbym, aby była to platforma krzyżowa, zajmująca się takimi plikami jak pliki, gniazda i wątki. OOP wydaje się być świetnym sposobem na poradzenie sobie z tym, ale tak naprawdę nie znalazłem dobrego wzorca do pisania klas, które dzielą tę samą platformę interfejsu.Wieloplatformowa wersja OOP w języku C++
Łatwe podejście to po prostu zaplanowanie meta-interfejsu, użycie go w całej reszcie programu i po prostu skompilowanie tej samej klasy z różnymi plikami w zależności od platformy, ale czuję, że musi być lepiej sposób, który jest bardziej elegancki; przynajmniej coś, co nie pomyli IntelliSense z tym, co jest, byłoby miłe.
Wziąłem spojrzeć na niektóre z mniejszych klas w źródle wxWidgets, a oni korzystają podejście, które wykorzystuje Prywatny członek gospodarstwa danych dla danej klasy, np
class Foo
{
public:
Foo();
void Bar();
private:
FooData data;
};
Następnie można skompilować ten po prostu wybierając różne pliki implementacyjne w zależności od platformy. To podejście wydaje mi się dość nieostrożne.
Innym podejściem, które rozważałem jest pisanie interfejsu i zamiana klas, które dziedziczą z tego interfejsu w zależności od platformy. Coś takiego:
class Foo
{
public:
virtual ~Foo() {};
virtual void Bar() = 0;
};
class Win32Foo
{
public:
Win32Foo();
~Win32Foo();
void Bar();
};
Oczywiście ten rodzaj śrub aż rzeczywista instancji, ponieważ nie wiem, których realizacja stworzyć przedmiot, ale że można obejść przy użyciu funkcji
Foo* CreateFoo();
i zmieniające implementację funkcji w zależności od platformy, na której pracujesz. Nie jestem też wielkim fanem tego, ponieważ nadal wydaje się niezbyt ciekawy zaśmiecanie kodu za pomocą zestawu metod tworzenia instancji (a to byłoby również niespójne z metodą tworzenia obiektów nie-platformowych).
Które z tych dwóch podejść jest lepsze? Czy istnieje lepszy sposób?
Edycja: Moje pytanie nie brzmi: "Jak napisać wieloplatformowe C++?" Przeciwnie, jest to "Jaka jest najlepsza metoda abstrakcji kodu między platformami przy użyciu klas w C++, przy jednoczesnym zachowaniu jak największej korzyści z systemu typów?"
To dobry pomysł, a na pewno przyjrzę się temu, co Boost tam robi. Jestem ciekawy, czy ten wzorzec pozwala na zmianę stanu klas między implementacjami? Na przykład uchwyty pliku POSIX vs Win32 mają inny typ - jeśli pisałem otoki pliku, stanowe klasy/klasy musiałyby być inne. – ShZ
Zrobiłbyś klasę 'file_handle' i zwyczajnie wypchnąłeś uchwyt w' void * '. Implementacja może przywrócić ją do tego, czego potrzebuje. Gwarantuje to bezpieczeństwo według standardu. Ta metoda działa również dobrze, jeśli dynamicznie ładujesz implementacje, ponieważ po prostu zamieniasz 'detail :: whatever' na' some_function_pointer', ładowane z biblioteki. – GManNickG
+1: zawsze deleguj do systemu kompilacji, co jest specyficzne dla czasu kompilacji –