こんばんわ。
意味不明なタイトルで申し訳ありません。
ライブラリ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件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
どうもすみません、回答 #2 の中に恥ずかしいミスがありました。
#ifndef _NEWLIB
は
#ifdef _NEWLIB
の間違いです。
上記間違いのままだと、新しいライブラリ B を使うために _NEWLIB を付けると古いライブラリ A を参照し、前のを使おうと _NEWLIB 無しにすると新しい方を使うという正反対の結果となってしまいました。
お手数をおかけして申し訳ありませんでした。
早々のご返答ありがとうございます。
質問はできるだけ伝わりやいように書いたつもりでした。
サンプルも提示していただき助かります。
これを元に発注者に相談します。
No.2
- 回答日時:
……っと、いかん、#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();
}
}
としてください。
No.1
- 回答日時:
つ 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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
- Ruby No route matches [GET] "/posts/5/destroy" 1 2022/03/24 13:00
- PHP アップロードファイルの数に応じてCSSを動的に変更したいのですが、方法がわかりません 3 2023/07/23 21:59
- PHP アップロード画像数でCSSを分けることに成功したのですが、画像の横に文字を並べることが出来ません。 3 2023/07/28 17:16
- Java java final 1 2022/06/10 22:49
- PHP SQLとPHPの連結方法がわからないのでアドバイスお願い致します 1 2022/07/12 12:16
- HTML・CSS ヘッダーの画像にメインエリアがかぶってしまいます 1 2022/11/28 14:06
- HTML・CSS CSSがなぜかfont-sizeだけ効かない...記述がまちがっているんでしょうか 5 2022/04/09 17:52
- HTML・CSS CSSのホバーエフェクト 1 2023/06/19 06:53
- HTML・CSS サルワカさんの吹き出しのスタイルシートについて。 https://saruwakakun.com/h 2 2022/10/28 22:55
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Ps+のフリープレイでDestiny2の...
-
Google ColaboでGUI作成
-
python urlopen error について...
-
Windows Media Playerを開くと...
-
本格的なGUIを作るのにおすすめ...
-
scipy っていうのをいれようと...
-
マイコンSHでSQRT(平方根)が...
-
DirectX Graphics と OpenGLっ...
-
【iTunes】CDをiPhoneに取り込...
-
VB.Netでの暗号化通信
-
ベッセル関数を使う
-
LIBCMT.LIBをリンクしてコンパ...
-
WAVE⇔MP3のためのライブラリ
-
sleep関数
-
iMovieのライブラリを移動する方法
-
VB.NET Blowfishで文字列を暗号化
-
ATLとSTLの違いは何でしょうか?
-
DLL読み込み時エラー
-
declaration of 'index' shadow...
-
Dreamweaverのライブラリが反映...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Ps+のフリープレイでDestiny2の...
-
Windows Media Playerを開くと...
-
本格的なGUIを作るのにおすすめ...
-
python urlopen error について...
-
Google ColaboでGUI作成
-
scipy っていうのをいれようと...
-
システムコールと標準ライブラ...
-
ライブラリ作成時のグローバル...
-
強化学習の環境作成、AI。自動...
-
プログラマーで「使えない人」...
-
unix-c と linux-c の違いは?
-
C++ 標準ライブラリの実際の中...
-
マウスのクリックを自動で
-
C# EXCELセルの入力規則設定に...
-
LIBCMT.LIBをリンクしてコンパ...
-
gcc に mktemp 危険と怒られ...
-
Dreamweaverのライブラリが反映...
-
静的ライブラリから静的ライブ...
-
DLL読み込み時エラー
-
sleep関数
おすすめ情報