人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

C++言語初心者です。よろしくお願いします。
staticを使わずにコードを書きたいのですが、無名空間の使い方がわかりません。
どなたかご教授をお願いいたします。それとも今回の場合は、無名空間を使う必要がないのでしょうか?
//list7-5b.cpp

//クラスの定義

/* namespace
{
char* kaishamei;
}
*/
class Jugyoin
{
public:
static char* kaishamei;
int number;
char shimei[80];
double kyuyo;
};

//静的メンバ変数の実態となるグローバル変数
char* Jugyoin::kaishamei = "技術評論社";

#include <iostream>
using namespace std;

//クラスを使う側のコード
main()
{
//クラスで静的メンバ変数を使う
cout << Jugyoin::kaishamei << endl;

//オブジェクトを作成する
Jugyoin tanaka;

//オブジェクト名で静的メンバ変数を使う
cout << tanaka.kaishamei << endl;

return 0;
}

●質問者: gbs01
●カテゴリ:コンピュータ 学習・教育
✍キーワード:C++ Char Class DOUBLE Number
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● yo-kun
●35ポイント ベストアンサー

無名名前空間とはそれが定義されているファイルとは別のファイルからはアクセスできないようにするためのものです。

従って、無名名前空間を利用する場合、それを利用する側(ここではcoutへの出力部分)が同じファイルにある必要があります。

namespace {
 char* kaishamei = "技術評論社";
}

#include <iostream>
using namespace std;

int main()
{
 // 無名名前空間のkaishameiを使う
 cout << kaishamei << endl;
}

このように使えます。


ちなみにご理解されているとは思いますが、ご質問のコードにある

Jugyoin::kaishamei

tanaka.kaishamei

は同じものを指します。

どちらで記述してもよいのですが、後者はコードを読んだときにkaishameiがインスタンス変数だと勘違いする可能性があるので、Juhyoin::kaishameiと記述するのがよいと思います。

(個人的な好みによると思いますが)

◎質問者からの返答

なるほど、ありがとうございます。


2 ● かえる
●35ポイント

static char* kaishamei;

こちらを

char* kaishamei

にしたいということでよいでしょうか?

コンストラクタ内で代入するのはどうでしょう?

class Jugyoin
{
public:
 char* kaishamei;
 int number;
 char shimei[80];
 double kyuyo;
 // コンストラクタ
 Jugyoin(void){kaishamei = "技術評論社";}
};

staticをなくしたい理由はなんでしょう?

文章から推察するに、クラス内にstaticで持つのではなくグローバル変数にしたいということでしょうか?

グローバル変数にしたいのならば、なぜグローバル変数にしたいのでしょうか?

変更したいことがあるのでしょうか?それならばファクトリメソッドを作るのほうがよいのではないかと思います。


とりあえず、何がやりたいのかよくわからないのですが、モデルクラス(データを保持するだけのクラス)を作りたいのではないかと推察します。だとすると、オブジェクト指向の観点からは、クラス内にstaticで持つほうがグローバル変数にするよりもベターだと思います。


ちょっと回答になっているかどうか不安ですので、追加の情報をお願いします。


ちなみに無名空間とは、

extern "C" {
 void func1();
}

これのことですか?

◎質問者からの返答

お書きになったとおり、

「static char* kaishamei;

こちらを

char* kaishamei

にしたいということでよいでしょうか?」

そういうことをしたいと思っています。

最近のC++では、staticは推奨されていないと聞きましたので、それでstaticを使わない方法をお聞きしました。あまり深く考えていませんでした。無名空間は

/* namespace

{

char* kaishamei;

}

のようなものを想定していました。

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ