2017-12-14 53 views
0

基本的なC++のものをいくつか練習したかったのです。私はそれを実験するために継承に焦点を当てました。私はいくつかの奇妙な問題に直面するまですべてがうまくいった: '洞穴'は、この範囲で宣言されていませんでした。私はいくつかのトピックを見てきましたが、そのほとんどはヒントがライブラリを追加するようなものだったり、「namespace stdを使って」書いていましたが、私の問題は解決しません。のコンストラクタ 'cout'がこのスコープで宣言されていません

#include <iostream> 

class podst 
{ 
public: 
    float a; 
    float b; 
    float dodaw(); 
    podst(float c,float d) : a(c), b(d) 
    { 

    } 
}; 
float podst::dodaw() 
{ 
    return (a+b); 
} 

class poch : public podst 
{ 
    poch() : podst(5,4) 
    { 
     cout << a << endl << b << dodaw() << endl; 
    } 

}; 


using namespace std; 
int main() 
{ 
    podst podst(1,2); 
    cout << podst.dodaw() << endl; 
    poch poch2; 

    return 0; 


} 
+0

それは代わりに 'std名前空間を使用しての'のstd :: cout'を利用するためにはるかに良いです; 'ですべてを。 https://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice –

答えて

1

pochグローバル名前空間から、ではないstd名前空間からcoutを呼び出します。 using namespace std;ディレクティブは、実際にはそれ以下のものであり、上記のものではありません。あなたは全体の名前空間接頭辞を毎回書きたくない場合には、ファイル単位ではなく、その後、関数単位でそのディレクティブを配置する方が良いでしょう:

poch() : podst(5,4) 
{ 
    using namespace std; 
    cout << a << endl << b << dodaw() << endl; 
} 

このアプローチは、大規模なコードベースを維持するのに役立ちます個性的である。

+0

なぜ私はあなたの提案された解決策としてコンストラクタ本体で 'using namespace std;'を選択したのか不思議です。 –

+0

@FrançoisAndrieux私は、関数ごとにその指示文を利用することを提案しました。 – VTT

1

使用する名前空間stdは、初めてcoutを使用する場合よりも低くなります。 pochクラスでstd :: coutとstd :: endlを使ってみてください。

+0

+1。さらに、 'std :: endl'を使用する代わりに、' '\ n''を使用してください。このコードは 'std :: endl'が行う余分なものは必要ありません。 –

0

使用する宣言は、書き込むポイントから有効になります。 coutへのコールはそのポイントよりも上にあるので、usingでカバーされていないので、そこでstd::coutを綴る必要があります。

You should avoid using namespace std。より良い選択肢は、必要なものだけを引き出すことです。 using std::cout;となります。しかし、より良い選択は、修飾された名前を使うことだけです。入力するのにもう少しですが、あいまいさを防ぎます。修飾された名前は私が見たすべてのコードベースで非常に遍在しています - 少なくとも私にとって - coutのような修飾されていない名前は、ちょっと驚くべきことです。

0

よく、pochは親クラスから継承するクラスなので、 ファイルの先頭に標準の名前空間を宣言してすべてのクラスと関数にグローバルにする必要がありますが、mainの前に宣言してpochクラスをstd :: coutとstd :: endlを明示的に使用することができ、プログラムのコンパイルに問題はありません。

+0

他の回答を削除することをお勧めしました。さらに追加するコンテンツがある場合は、1つの質問に複数の回答を作成するのではなく、既存の回答を編集して改善するために[編集]ボタンを使用します。 –

0
class poch : public podst 
{ 
    poch() : podst(5,4) 
    { 
     //you should have used std::cout 
     std::cout << a << endl << b << dodaw() << std::endl; 
    } 

}; 
+1

他の回答にこの回答を削除/移動してください。 –

0

あなたは標準ライブラリの名前空間の呼び出し元:: STDを省略したい場合、あなたは

using namespace std; 

前に書くべき(通常は右の#includeステートメントの後に書かれており、(int型メインの前に)」

cout << ... 

コンパイラがコードを順番に読み込むので、 'using'を使うのは悪い習慣であることに注意してください。std :: namespace呼び出し元をそのまま使用することをお勧めします。

std::cout << "Hello World!" << std::endl; 

特定の問題修正方法:

#include <iostream> 

using namespace std; 

class podst { ... 
関連する問題