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;
}
無名名前空間とはそれが定義されているファイルとは別のファイルからはアクセスできないようにするためのものです。
従って、無名名前空間を利用する場合、それを利用する側(ここではcoutへの出力部分)が同じファイルにある必要があります。
namespace { char* kaishamei = "技術評論社"; } #include <iostream> using namespace std; int main() { // 無名名前空間のkaishameiを使う cout << kaishamei << endl; }
このように使えます。
ちなみにご理解されているとは思いますが、ご質問のコードにある
Jugyoin::kaishamei
tanaka.kaishamei
は同じものを指します。
どちらで記述してもよいのですが、後者はコードを読んだときにkaishameiがインスタンス変数だと勘違いする可能性があるので、Juhyoin::kaishameiと記述するのがよいと思います。
(個人的な好みによると思いますが)
無名名前空間とはそれが定義されているファイルとは別のファイルからはアクセスできないようにするためのものです。
従って、無名名前空間を利用する場合、それを利用する側(ここではcoutへの出力部分)が同じファイルにある必要があります。
namespace { char* kaishamei = "技術評論社"; } #include <iostream> using namespace std; int main() { // 無名名前空間のkaishameiを使う cout << kaishamei << endl; }
このように使えます。
ちなみにご理解されているとは思いますが、ご質問のコードにある
Jugyoin::kaishamei
tanaka.kaishamei
は同じものを指します。
どちらで記述してもよいのですが、後者はコードを読んだときにkaishameiがインスタンス変数だと勘違いする可能性があるので、Juhyoin::kaishameiと記述するのがよいと思います。
(個人的な好みによると思いますが)
なるほど、ありがとうございます。
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;
}
のようなものを想定していました。
回答ありがとうございます。
なるほど、ありがとうございます。