掲示板一覧   -   トピック一覧
   Enterprise Architect 全般
     staticメンバ変数の生成コードについて(C++)


スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 トピック
未登録ゲスト
投稿日時: 2008-1-18 11:20

staticメンバ変数の生成コードについて(C++)

クラスのstaticメンバ変数の利用を考えており、属性の"static"にチェックを入れてC++でコードを生成しているのですが、.hのクラス宣言内には宣言が出力されるものの、同時にクラス宣言外に必要とされる定義が出力されません(一般的には.cppに記述するようです)。具体的には以下のような感じです。

●TestClass.h (EAの生成コードより)
class TestClass
{

private:
static int value;

};


●TestClass.cpp(理想的な生成コード)
#include "TestClass.h"

int TestClass::value; ※この定義が必要だが出力されない

これはstaticメンバ変数を宣言するルールのようでして、実際クラス宣言外での定義がない状態だとコンパイルで「未定義の参照」とエラーが出てしまいます。
このルールに関してはEAはサポートしていないのでしょうか?また、上記のような.cppを生成するテンプレートの編集方法がありましたら教えていただけないでしょうか?
tkouno
投稿日時: 2008-1-18 11:26
EA Administrator
投稿: 3939

Re: staticメンバ変数の生成コードについて(C++)

ご指摘の件につきまして、現在のEnterprise Architectでは
(おそらく将来も)サポートしていません。

既定のテンプレートでは、ご指摘の内容を手作業で
追加する必要がございます。

この理由としまして、cppの追加すべき位置は、どのクラスにも
所属していない(UMLとして表現できない=同期できない)ことが
大きな理由です。このため、将来的にも対応できないと
思います。

ただ、出力のみであれば、コード生成テンプレートで対応することは
可能かもしれません。挑戦してみますので、しばらくお待ちください。

tkouno
投稿日時: 2008-1-18 11:54
EA Administrator
投稿: 3939

Re: staticメンバ変数の生成コードについて(C++)

ざっと作成してみました。

以下、解説を含めて説明いたします。
今回のものが全ての場合に対応しているかどうかはわかりませんので
状況に応じて、さらに修正してご利用ください。

○基本方針

先ほどの返信にあるように、通常のクラスの定義の「外」に
あるので、単純に「Attribute」テンプレートに追加して
対応することはできません。
よって、Namespaceテンプレートから別途属性の定義を
確認するようなテンプレートを追加します。

○Namespace Body Implテンプレート

この内容を、以下のように修正します。(先頭3行はコメントです)
(2番目の行を追加します。)

%list="NamespaceImpl" @separator="\n\n\n"%
%list="Class__Static" @separator="\n"%
%list="ClassImpl" @separator="\n\n\n"%

○Class__Staticテンプレートの追加

独自処理のための、新規のテンプレートを追加します。
これは、画面左下にある「新規テンプレートの追加」ボタンを押して
「対象の種類」に「Class」を、「テンプレート名」の欄に「Static」と
入力してください。

左側のテンプレートの一覧の一番下に「Class__Static」という
テンプレートが追加されますので、それを選択して、以下の1行を
入力して保存してください。

%list="Attribute__Static" @separator="\n"%

このように、属性のための処理を追加する場合でも、直接属性の
テンプレートを作成して呼び出すことはできません。属性(や操作)は
クラスに所属するものですので、まずクラスのテンプレートを
追加しなければなりません。


○Attribute__Staticテンプレートの追加

次に、先ほどのClass__Staticテンプレートから呼ばれる
新しいテンプレートを作成します。
画面左下にある「新規テンプレートの追加」ボタンを押して
「対象の種類」に「Attribute」を、「テンプレート名」の欄に「Static」と
入力してください。

左側のテンプレートの一覧の下から2番目に「Attribute__Static」という
テンプレートが追加されますので、それを選択して、以下の内容を
入力して保存してください。


%if attStatic=="T"%
%PI=" "%
$ptr = %attContainment=="By Reference" ? "*" : ""%
%RESOLVE_QUALIFIED_TYPE("::", "int")%$ptr
%PI=""%
%className%::%attName%
%if attCollection == "T" and attContainerType != ""%
%attContainerType%
%endIf%
%if attInitial != ""%
= %attInitial%
%endIf%
;
%endIf%


先頭行のif文で判断し、staticの場合のみ処理を行います。
6行目でクラス名::属性名の出力を作成しています。
それ以外の部分のほとんどは、「Attribute Declaration」テンプレートからの
コピーです。


というような感じで、カスタマイズを行うことで
自由に出力することができます。

ぜひお試しください!
未登録ゲスト
投稿日時: 2008-1-18 13:35

Re: staticメンバ変数の生成コードについて(C++)

思い通りの生成コードを得ることができました。
乱暴なお願いに対応していただきありがとうございます。
テンプレートの解説も分かりやすく勉強になりました。

また、EAでサポートしない理由についても納得致しました。
カスタマイズによる同期への影響については注意します。
tkouno
投稿日時: 2008-1-18 13:41
EA Administrator
投稿: 3939

Re: staticメンバ変数の生成コードについて(C++)

無事に解決できたとのことで安心しました。

このように、テンプレートを編集するといろいろと
カスタマイズした出力を行うこともできますので
ぜひいろいろとお試しください。

目安として、ある一定の決まったルールで作業を行わないと
いけない場合(端的な例として、いわゆる「コピペ」作業が
発生する場合、など)は、その内容をテンプレート側に
持たせることで、作業ミスをなくすなどの効果もあります。

ぜひご活用ください。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ