プロが教える店舗&オフィスのセキュリティ対策術

■環境
OS:XP
言語:C++
コンパイラ:Visual C++ 2008

char*やstd::string等で格納された文字列を使用して
変数を宣言することは可能でしょうか。

用途として、テキストファイル等から文字列を取得し
その文字列を変数名としてプログラミング内で使用するという方法を考えています。

よろしくお願い致します。

A 回答 (9件)

動的な変数はたま~~~に欲しくなったりするんですが…。



本来の意味での変数とは少し違いますが、私の場合は添字参照演算子を使った擬似変数クラスを使います。
(簡単にint変数とします)
-----------
class CVirVar {
public:
  int & operator[](char* szVarName) {
    // 変数を探し出しす
    return 見つけた変数;
  }
}
-----------

用法
-----------
CVirVar var;
int   a;
char  name[] = "ほげ";
var[name] = 1;
a = var[name];
-----------

_variant_tとかで扱うとエラーも返せるし色んな型が格納できるので、一度作っておくと便利(?)ですよ。
    • good
    • 0
この回答へのお礼

テンプレートクラスを使用すると、型名の予測が出来ないので
結局コーディングしないといけませんでしたが
この方法だと色々できそう?だと思いました。

参考になります。ありがとうございました。

お礼日時:2009/10/02 16:32

「静的に」, つまり「コンパイル時に変数が決定している」のであれば #2 の「ソースコードジェネレータ」とか #4 の「テンプレートファイル」のような方法でできます.


「動的に」, つまり「プログラムを実行している最中に変数を宣言する」ということであれば不可能です. C でも C++ でも「変数はソースコード上で使う前に宣言されている」必要があります.
なお, Lisp や Perl などのように「動的に変数を宣言できる」言語もありますが, その変数管理の本質は「シンボルテーブル」です. つまり連想配列.
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
実際に変数「名」は変える必要すらないことがよくわかりました。
良く考えると結局中身を動的に管理させたかっただけだということに気付けました。

様々な回答を頂きありがとうございました。
参考になった回答はたくさんありますが、質問の趣旨に合った回答に点数をつけたいと思います。

お礼日時:2009/10/02 16:36

状況によりけりですが、テンプレートファイルを使用することは偶にあったりする。



データベースのテーブル毎のフィールド定義ファイル(構造体)と
アクセス用クラスを多重継承(デザパタ:ブリッジ)させて
そのテーブルアクセス用クラスを作ったりするときなんかに
テーブル情報からフィールド名/属性など読み込んで
テンプレートファイルを利用し、自動でフィールド定義ファイルを
つくるなんてことを過去にした。

利点としては、デバッガでトレースがしやすい。(動的だと少し面倒)
自動で作るので、タイプミス等のエラーが減る。
記述量がけっこう減る。
ADOなんかの場合でいうと
CString strWork = (LPCTSTR)(_bstr_t)m_rs->Fields->GetItem('ほにゃらら')->Value ;

CString strWork = m_rs->m_ほにゃらら ;
になんかになる。。。
    • good
    • 0
この回答へのお礼

返事が大変遅れてしまい、申し訳ありません。
私の知識が足りなかったため、回答の説明がわからなかったので勉強してきました。
まだよくわかっていませんが、テンプレートを使用したアイデアとして覚えておこうと思います。

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

お礼日時:2009/10/02 16:20

私も#5さんと同意見。


C/C++で「本物の変数」とするのは無意味だし不可能。

std::mapやCMapなどの連想配列で管理するのが普通だし楽ですよ。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

たしかに今回の私の問題では無意味でした。
titokani様から言われて確信が持てました。

しかし、不可能かどうかはまだわかりません。

お礼日時:2009/08/18 01:49

う~ん, ソースコード中で「本物の変数」として存在する必要があるのかどうかよくわからないんですが, まず最初に検討するのは std

::map かなぁ....
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

途中でTacosan様が言われたことを理解できました。
前の例で言いますと、画像管理クラスへのポインタと画像を識別する定数をmapコンテナで管理……という感じでマネージャクラスを作ることにしました。

問題は解決できましたが、私の質問の処理が実装できると何かと便利だと考えていますので、一時はこの質問を締め切らないようにしたいと思います。

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

お礼日時:2009/08/18 01:45

質問がなんとなくわかりました。

。。

自分がやるとすると、テンプレート用のファイルをつくり、文字列置換ソフトを使ったり、自分で置換スクリプト作ったりするかな?
変数は↓みたいな感じで、、、
int @@@変数1@@@ ;
char @@@変数2@@@[10] ;
    • good
    • 0
この回答へのお礼

遅くなりましたが、回答ありがとうございます。

意固地になっているのかもしれませんが、テンプレート用のファイルを作って文字を置換して使うというのは馴染めません……。
何とかプログラミングでやりたい、というのが感想でした。
(もし、YEND77様の言っている事と意味が違う場合は申し訳ありません)

しかし、実際にはこのような手法はままあるようですね。
ソースを見やすく整理するためにも使ってみたいと思います。

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

お礼日時:2009/08/18 01:37

(ご参考までに、、、)


基本的にcの場合、固定の変数名でも、コンパイルされた後のバイナリファイルには
変数名は残っていません。
(内部的にはアドレスでしかないorレジスタのみ)

c#なんかの場合は、CLRなんでバイナリ中に変数名とかみれたかと思うけど・・・

もしかしたらマネージドなc++ならできるかもしれない???
その場合リフレクションとかその辺のキーワードで探せばでてくるかもね。。。

この回答への補足

プログラミング内という意味では無く、ソースファイル内で使用したい、という意味でした。

誤解を招く質問で申し訳ありませんでした。

補足日時:2009/08/14 22:16
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

リフレクションについてですが、
http://msdn.microsoft.com/ja-jp/library/y0114hz2 …
http://oshiete.nikkeibp.co.jp/kotaeru.php3?qid=2 …
を見た限りですと、実行時にメソッドを変更するという方法で間違いは無いでしょうか?

もしそうですと、少し私のやりたいことと違う気がします。
例えば、表示する画像が三枚あったとしましょう。
表示させました。
続いて、もう一枚画像を追加したいとします。

ここで普通であれば、リソースを管理している部分に
ファイル名を使用し新しい変数の宣言、描画関数の呼び出しを追加しますよね。

しかし、もし変数名を動的に管理できるのであれば
描画関数の呼び出しを追加するだけで良くなります。
ソースと画像名との整合性が合わない場合はコンパイルエラーとなるでしょうし、とても便利だと考えています。

お礼日時:2009/08/14 22:42

それをプログラミングないで使用して何が起こるのでしょう?



変数名は通常はコンパイル時に消去されます。
なので、どんな名前をつけたとしても実行ファイル内で使用されることはありません。(デバッグモードでコンパイルすればある程度は残るかもしれませんが・・・)

単にソースファイルにその変数名を使用したいだけであればそういうソースジェネレータのようなものを作れば良いので・・・

この回答への補足

プログラミング内という言い方が悪かったようです。
申し訳ありません。

ソースファイル内で使用したい、という意味です。

補足日時:2009/08/14 22:12
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

例えば、リソースを管理する際に、リソースを保持する変数名とリソース名を外部テキストファイルで管理出来ればすごく便利なので、その方法を探しているのです。

ソースジェネレータというヒントで現在調べている途中です。

お礼日時:2009/08/14 22:23

可能です。

    • good
    • 0
この回答へのお礼

回答ありがとうございます。

もしよろしければ、その方法やヒントを頂ければ幸いです。

お礼日時:2009/08/14 22:18

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