2

C++ でヘッダー ファイルをインクルードする際に問題があります。私の知る限り、using namespace stdヘッダー内に配置するのは良い設計ではありませんが、削除しようとするとエラーが発生しました。ヘッダーファイルのコードは次のとおりです。

#include <iostream>
#include <string>

//using namespace std;
class Messages
{
public:
Messages(string sender, string recipient,int time);
void append();
string to_string();


private:
int time;
string sender;
string recipient;
string text;

};

を含め<string>ました。ただし、名前空間 std を使用しないと、すべての文字列にエラーが表示されます。using namespace std設計が悪いため、ヘッダー ファイルに追加したくありません。では、どうすれば修正できますか?

前もって感謝します。

4

2 に答える 2

5

std::stringどこにでも書くだけです。

#include <iostream>
#include <string>

//using namespace std;
class Messages
{
public:
Messages(std::string sender, std::string recipient,int time);
void append();
std::string to_string();


private:
int time;
std::string sender;
std::string recipient;
std::string text;

};

経験則として、(.cpp ファイルであっても) 標準ライブラリのデータ型またはアルゴリズムのいずれかを使用するときは常に、接頭辞としてstd::. 入力するのに十分短いので、苦痛から解放されます。

上級ユーザーが関数スコープで using 宣言を使用する理由がいくつかあります。たとえばswap、標準ライブラリの関数 (たとえば ) をオーバーロードして独自のデータ型 (独自の名前空間内) を操作する場合などです。たとえば、この Q&Aを参照してください。

于 2013-05-22T08:23:09.770 に答える
3

クラスは名前空間string内で宣言されます。別の名前空間内にあるクラスをアドレス指定するには、次の 3 つの方法があります。 std

  1. いつも書くことで<namespace>::<class>
  2. <class>への参照が実際には 1. 上記を意味することを明示的に宣言することによりusing <namespace>::<class>;:
  3. 現在の<class>名前空間で解決できなかった a への参照も、追加の名前空間で検索する必要があると宣言することによって:using namespace <namespace>;

表現力の高い順に並べています。1. はどこに書かれていても完全に明確ですが、3. 使用されている (場合によっては複数の) 名前空間に慣れていない場合は、いくつかの検索と頭のかき傷が必要になる可能性があります。

これらは、関連するタイピングの降順でもソートされます。そのため、一部の人々 (特に教科書) は 3 を選択します。

ただし、ヘッダー内の名前空間の解決だけでなく、ヘッダーを含むすべての人の名前空間の解決も台無しにするため、ヘッダー ファイルでは使用しないでください。これにより、名前空間の競合、インクルードの順序に応じた奇妙なエラー、その他多くの頭痛の種が発生します。ただしないでください。using ...

一般的に言えば、実装ファイルのオプション 1. と 2. には賛否両論がありますが、オプション 3. は、後でソースを操作する必要がある人にとって単に不快です。

于 2013-05-22T08:33:52.110 に答える