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;
}

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2009/06/20 00:05:26
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:yo-kun No.1

回答回数220ベストアンサー獲得回数30

ポイント35pt

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

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

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

#include <iostream>
using namespace std;

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

このように使えます。


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

Jugyoin::kaishamei

tanaka.kaishamei

は同じものを指します。

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

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

id:gbs01

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

2009/06/17 22:42:50

その他の回答1件)

id:yo-kun No.1

回答回数220ベストアンサー獲得回数30ここでベストアンサー

ポイント35pt

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

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

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

#include <iostream>
using namespace std;

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

このように使えます。


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

Jugyoin::kaishamei

tanaka.kaishamei

は同じものを指します。

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

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

id:gbs01

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

2009/06/17 22:42:50
id:drill256 No.2

回答回数175ベストアンサー獲得回数7

ポイント35pt

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();
}

これのことですか?

id:gbs01

お書きになったとおり、

「static char* kaishamei;

こちらを

char* kaishamei

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

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

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

/* namespace

{

char* kaishamei;

}

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

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

2009/06/17 23:03:03
  • id:yo-kun
    >最近のC++では、staticは推奨されていないと聞きましたので、

    staticキーワードはいくつか異なる使用法があります。
    推奨されないと言われている者はグローバルなスコープにある(クラスに所属していない)変数や単独の関数に対してのことかと思います。
    他のファイルから参照不可にするためにstaticを付ける方法のことですね。
    この場合は無名名前空間に置くのがC++らしいやり方とされていると思います。

    しかしクラスに所属しているstaticメソッドやstaticメンバ変数はそのままで良いと思いますよ。
    他のクラスから使用してほしくないならばprivateにすればよいです。
  • id:gbs01
    なるほど、ありがとうございます。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません