アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんばんわ。
意味不明なタイトルで申し訳ありません。
ライブラリAからライブラリBへの切り替えの仕事を請け負いました。
可能な限りソースコードはいじらないでほしいということで困っています。
メンバー関数は互換性があるので問題ないとのことでした。

以下のような基底クラスと派生クラスがあったとします。
class A を class B に切り換えたいとのことです。

-----------------------

class A
{
virtual create() ;
}

-----------------------

class B
{
virtual Create() ;
}

class C : public A
{
virtual create() ;
}

まず class C の派生元を以下のように

typedef B A ;

と記述した共通ヘッダーを用意して class C にincludeしてすり替えることができました。
ところが困ったのがcreate関数で関数名の先頭文字がライブラリAが小文字で、ライブラリBが大文字になっていました。
これをうまくすり替えたいのですが手段が思いつきません。class C 側に

#ifdef _NEWLIB
virtual Create() ;
#else
virtual create() ;
#endif

記述するしか思いつきませんでした。ただ問題は class A から派生しているクラスが結構あるのですべてにifdef ディレクティブを記述するのは結構な作業なのと、なにより記述ミスが怖いです。
何か良い手段はないものでしょうか?

A 回答 (3件)

どうもすみません、回答 #2 の中に恥ずかしいミスがありました。



#ifndef _NEWLIB



#ifdef _NEWLIB

の間違いです。
上記間違いのままだと、新しいライブラリ B を使うために _NEWLIB を付けると古いライブラリ A を参照し、前のを使おうと _NEWLIB 無しにすると新しい方を使うという正反対の結果となってしまいました。
お手数をおかけして申し訳ありませんでした。
    • good
    • 0
この回答へのお礼

早々のご返答ありがとうございます。
質問はできるだけ伝わりやいように書いたつもりでした。
サンプルも提示していただき助かります。
これを元に発注者に相談します。

お礼日時:2014/10/08 10:51

……っと、いかん、#1の回答では何をやっているのか解りづらかったですね。

では改めてサンプルコードを記載します。

#ifndef _NEWLIB

class D {
virtual create() {
base.Create();
}

private:
B base;
}

typedef D A;

#endif

要するに、B での処理を呼び出すだけの A での名前と同じメンバ関数を持つクラスを間にかませてやればいいだけですね。

……あ、ひょっとして新しいライブラリでもライブラリの使用には B から派生させないといけませんか?
ならば、D の定義を

class D : public B {
virtual create() {
this.Create();
}
}

としてください。
    • good
    • 0

つ Adapter パターン


http://ja.wikipedia.org/wiki/Adapter_%E3%83%91%E …

create() の宣言がこのままだとコンパイル通らないとおもうんだけど、とりあえずそこはそのままで以下の通りでいける、と思う。

class D {
virtual create() {
#ifdef _NEWLIB
base.Create();
#else
base.create();
#endif
}

private:
#ifdef _NEWLIB
B base;
#else
A base;
#endif
}

#ifndef _NEWLIB
typedef D A;
#endif
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!