以前、こちらにてC++の質問をさせていただきました者です。
現在、業務にてライブラリ設計/実装を任され、設計にてつまづいてしまったので、質問させていただきたく思っております。
環境はVC++2010です。
私自身のプログラミング経験は1年ほどC#に携わっていた程度です。
件名にもあるように、現在はC++で開発を行わなくてはならなくなり、プロジェクト全体で使用するEnum型の設計に困っています。
プロジェクトの構成は、
・1クラスにつき.hファイルと.cppファイルの対を作成
・基本的には、DtoクラスとHelperクラスの2つに大別
・Dtoクラスは必要な変数ひとまとまりの構造体のような役割+α
・Helperクラスはstaticな便利メソッドの集合体
・Dto, Helperクラスはそれぞれ複数個存在し、使用する際は#include
となっている中で、自分で定義したEnum型の変数をDtoクラスやHelperクラスに共通して利用させたい、というのが現在の状況です。
仮に自分で定義したEnum型をMyTypeだとすると、簡単にコードを記述(略多め)して、
/***********************
Helper.h
***********************/
class Helper {
public:
/** MyTypeを返却 */
static MyType hoge();
private:
/** 実装禁止 */
Helper();
/** 実装禁止 */
~Helper();
};
/***********************
Helper.cpp
***********************/
MyType Helper::hoge() {
MyType mType;
/** 省略 */
return mType;
}
/***********************
Dto.h
***********************/
class Dto {
public:
/** コンストラクタ */
Dto( MyType, MyType );
/** データ出力 */
void output();
private:
/** 1番目のMyType */
MyType first;
/** 2番目のMyType */
MyType second;
};
/***********************
Helper.cpp
***********************/
Dto::Dto( MyType m1, MyType m2 ) {
first = m1;
second = m2;
}
Dto::output() {
/** first, secondで条件分岐する何かの処理(省略) */
}
このような構成を実現させるために、enum class MyTypeをメンバに持つクラスを考えました。
/***********************
TypeEnum.h
***********************/
class TypeEnum {
public:
/** 共通Enum */
enum class MyType {
right,
center,
left,
};
/** 文字列をMyTypeへ変換 */
static MyType stringToMyType( const string );
};
/***********************
TypeEnum.h
***********************/
TypeEnum::MyType TypeEnum::stringToMyType( const string str ) {
/** 省略 */
}
▪️1. 全ファイルに#includeさせる
→多重includeとなりコンパイル不可
▪️2. class TypeEnumから継承させて利用する
→複数のクラスにTypeEnumを継承させようとするとclass TypeEnumの再定義…云々のエラーが発生しコンパイル不可
▪️2. についてはイマイチなぜエラーになるのか釈然としていない、といった状況です(C#ではできたはずなので…)。
大変長くなってしまいましたが、上記のような設計を実現するための良い方法がありましたら、是非お教え頂けると幸いです。
C++はまだ2ヶ月も触っていないため、とんちんかんなことを言っていたら申し訳ございません。
何卒よろしく御願い致します。