クラス中で宣言された構造体の内容を覚えるために

[戻る]
2006/06/02(金) 10:21:32
はじめまして、包です。
クラス中で宣言された構造体の値を覚えるために、
何をすればいいか教えてください。

--------------------------------------
class Format
{
private :
    struct FMT_INFO
    {
      char name;
      char def;
    };
    FMT_INFO FmtInfo[10];
    int index;

public:
    Format();
    virtual ~Format();
    char GetFmtName(int index) { return FmtInfo[index].name; }
    char GetFmtDef(int index)  { return FmtInfo[index].def; }
    void SetFmtName(char name, int index) { FmtInfo[index].name = name; }
    void SetFmtDef(char def, int index)   { FmtInfo[index].def = def;}
};
---------------------------------------

上のようなclassがあって、
Format format1;
Format format2;
を宣言します。

format1::SetFmtName(name0, 0)
format2::GetFmtName(0)
をやった時、format2::GetFmtName(0)でもらったNameの値がname0である
ようにしたいです。

よろしくお願いします。

Blue 2006/06/02(金) 10:26:55
とりあえず、
> Format format1;
> Format format2;
と分けるのはどうしてでしょうか?

別の変数を使いたいのであれば、参照を使えばよさそうですが。

2006/06/02(金) 10:44:54
こんにちは、Blueさん。

format1とformat2は違う関数中で宣言しました。
それぞれやる時、同じFmtInfo[10]にaccessしたかったです。

ebimayo 2006/06/02(金) 10:51:36
別々のインスタンスを生成してるから同じものにアクセスできないのでは?

Blue 2006/06/02(金) 10:53:03
本当はグローバル変数にしたいという感じでしょうか?
クラスのメソッド内であれば、メンバ変数にするのが普通ですが。


全体で、FormatのFmtInfoが一つしかありえないのであれば、staticメンバ変数にすると
か。
#include <iostream>

class Format
{
private :
    struct FMT_INFO
    {
      char name;
      char def;
    };
    static FMT_INFO FmtInfo[10];

public:
    Format(){};
    virtual ~Format(){};
    char GetFmtName(const int index) const{ return FmtInfo[index].name; }
    char GetFmtDef(const int index)  const{ return FmtInfo[index].def; }
    void SetFmtName(const char name, const int index) { FmtInfo[index].name = 
name; }
    void SetFmtDef(const char def, const int index)   { FmtInfo[index].def = 
def;}
};
Format::FMT_INFO Format::FmtInfo[10] = { 0 };

void func1()
{
    Format f;
    f.SetFmtName( 'a', 0 );
}

void func2()
{
    Format f;
    std::cout << f.GetFmtName( 0 ) << std::endl;
}

int main()
{
    func1();
    func2();
    return 0;
}

2006/06/02(金) 11:23:03
こんにちは、ebimayoさん。

FormatのFmtInfoはプログラム中で、一個だけです。
staticを使って、FmtInfoの値を覚えますね。
これから使います。

----------------------------------------------
Format::FMT_INFO Format::FmtInfo[10] = { 0 };
----------------------------------------------

今、FMT_INFO中のnameもdefもcharです。
しかし、もし、FMT_INFO中に、例えばint testがある、
charとintは違う。でも、上の式は大丈夫ですか?
Format::FMT_INFO Format::FmtInfo[10].test = { 0 };
にしますか?

Blue 2006/06/02(金) 11:27:33
> でも、上の式は大丈夫ですか?
単なる初期化です。よくやる手ですよ。
(ポインタメンバ変数だろうint型変数だろうがなんだろうが0で初期する)
# static変数だからなくても同じでした。

どうしても違和感があるならば、
Format::FMT_INFOにデフォルトコンストラクタをつくってください。

2006/06/02(金) 11:36:21
もし、初期化をやらないで、
Format::FMT_INFO Format::FmtInfo[10];
だけやっても大丈夫ですか?
初期化は他のところでやります。

Blue 2006/06/02(金) 11:38:27
> だけやっても大丈夫ですか?
大丈夫です。static変数ですから勝手に初期化されますが。

2006/06/02(金) 11:43:09
わかりました。

Blueさん、教えてくださって、ありがとうございました。

2006/06/02(金) 11:45:53
[[解決]]
解決済のチェックを忘れました。

古いスレッドには追加発言できません。