C++言語を用いてクロスプラットフォーム ( Linux, Win) のアプリ(単なるCUIアプリです)開発の勉強をしようとしているのですが、プリプロセッサをなるべく使わず尚且つソースをなるべく共有する方法、またはそれらの学習に役立つサイトを教えてください。 namespaceのうまい使い方や、preprocessorを使う必要はあるが、こうすると上手くnamespaceの特性を生かせる等。(preprocessor, namespaceの基本的な使い方は知っています。)

英語のページでも構いません。

宜しくお願い致します。

回答の条件
  • 1人3回まで
  • 登録:2007/10/23 03:35:19
  • 終了:2007/10/30 03:40:03

回答(3件)

id:Bookmarker No.1

しおり回答回数191ベストアンサー獲得回数342007/10/23 12:27:17

ポイント27pt

デザインパターンの内、

辺りを使うのが良いのではないでしょうか。

デザインパターンとともに学ぶオブジェクト指向のこころ (Software patterns series)オブジェクト指向における再利用のためのデザインパターン

id:pooh2005

質問の書き方が悪かったみたいですね。 すみません。

パターンの使用は結構なのですが、では実際パターンを用いてクロスプラットフォーム開発する方法をご教授願えますでしょうか?

Linux用にコンパイルした際には、このpreprocessorが働いてこちらのソースが使用されるようにするというような具体的な記述方法等です。

ありがとうございました。

2007/10/23 13:30:44
id:Bookmarker No.2

しおり回答回数191ベストアンサー獲得回数342007/10/23 16:45:52

ポイント27pt

どういう回答を期待しているのかいまいちわかりませんが…、以下のようなものですか?


■Template Method パターンが使える例

◇非オブジェクト指向

void method()
{
#if defined(PLT_UNIX)
    // method for step1
#elif defined(PLT_WINDOWS)
    // method for step1
#else
    #error unknown platform
#endif
    // method for step2
#if defined(PLT_UNIX)
    // method for step3
#elif defined(PLT_WINDOWS)
    // method for step3
#else
    #error unknown platform
#endif
    // method for step4
#if defined(PLT_UNIX)
    // method for step5
#elif defined(PLT_WINDOWS)
    // method for step5
#else
    #error unknown platform
#endif
    // method for step6
}


int main()
{
    method();
}

◇オブジェクト指向

class my_base
{
  public:
    virtual ~my_base() throw() {
    }

    void method() {
        method_for_step1();
        // method for step2
        method_for_step3();
        // method for step4
        method_for_step5();
        // method for step6
    }

  protected:
    virtual void method_for_step1() = 0;
    virtual void method_for_step3() = 0;
    virtual void method_for_step5() = 0;
};

class my_unix: public my_base
{
  protected:
    virtual void method_for_step1() {
        // method for step1
    }
    virtual void method_for_step3() {
        // method for step3
    }
    virtual void method_for_step5() {
        // method for step5
    }
};

class my_windows: public my_base
{
  protected:
    virtual void method_for_step1() {
        // method for step1
    }
    virtual void method_for_step3() {
        // method for step3
    }
    virtual void method_for_step5() {
        // method for step5
    }
};

my_base *create_my_object()
{
#if defined(PLT_UNIX)
    return new my_unix();
#elif defined(PLT_WINDOWS)
    return new my_windows();
#else
    #error unknown platform
#endif
}


int main()
{
    my_base *obj = create_my_object();
    obj->method();
    delete obj;
}
id:pooh2005

◇オブジェクト指向

後は、プラットフォーム間で共通の動作の場合は my_base クラスで処理すればよいのですね。

ありがとうございました!

・・・で、これは実際にクロスプラットフォーム開発においては標準的な方法なのでしょうか?

2007/10/24 02:22:46
id:KUROX No.3

KUROX回答回数3542ベストアンサー獲得回数1402007/10/23 17:03:29

ポイント26pt

http://0xcc.net/pub/uu-2004-08/

共通で使えるライブラリを使うのがお手軽ですが・・。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません