[C++] dlaczego nie można: 'using std::ios_base'


(Spwmarluk) #1

Witam,

Może ktoś mi wytłumaczyć o co dokładnie chodzi, bo metodą prób i błędów zrobiłem, że działa, ale nie wiem dlaczego :slight_smile:

bool zapisz(string nazwa, string tekst)

{

	char *nplik = new char[nazwa.length()+1];

	strcpy ( nplik , nazwa.c_str());

	ofstream plik(nplik, std::ios_base::app);

	if (!plik)

	{

		cerr << "Blad pliku '" << nplik << "'" << endl;

		return false;

	}

	plik << tekst << endl;

	plik.close();

	return true;

}

Powyższy kod działa, ale dlaczego nie mogę na początku programu zadeklarować:

using std::ios_base;

tylko muszę to robić zawsze w linii:

ofstream plik(nplik, std::ios_base::app);

i druga sprawa, czy to oznacza to samo?

ofstream plik(nplik, std::ios_base::app);

?=

ofstream plik;

plik.open(nplik, std::ios_base::app);

Zwykle staram się pisać tak kod, żeby nic nie krzyczał przy włączonym -Wall, stąd moja dociekliwość:slight_smile:


(Sawyer47) #2

SOA#1

#include 

#include 


using namespace std;

using std::ios_base;



int main()

{

	return 0;

}

Sprawdź u Ciebie. I podaj błędy jakie wypisał kompilator.


([alex]) #3
using namespace std;

Oznacza że zamierzasz używać całej przestrzeni nazw std.

using namespace std::ios_base;

Oznacza że zamierzasz używać klasy ios_base z przestrzeni nazw std.

using namespace std;

using std::ios_base;

Drugie polecenie jest bez sensu, ponieważ pierwsze już dołączyło całą przestrzeń nazw std w tym klasę ios_base.

using namespace std;

Powoduję że możesz użyć cout zamiast std::cout , ponieważ przestrzeń nazw std jest dołączona do kodu (dostępna bezpośrednio); Nie ma żadnej możliwości dołączenia klasy tak jak przestrzeni nazw, czyli nigdy nie będziesz mógł użyć app zamiast ios::app lub ios_base::app tak by kompilator zrozumiał że masz na myśli właśnie ios_base::app , no chyba że w metodach klasy pochodnej od ios_base. Aby Fiołek nie zaczął uściśleń :stuck_out_tongue: :
- [*:327qpxrs]Jeżeli piszesz klasę dziedziczącą po ios_base (nie koniecznie bezpośrednio) to w metodach takiej klasy można użyć samo app zamiast ios_base::app ; [*:327qpxrs]Zawsze możesz zdefiniować:

const int app=ios::app;

po czym używać samo app.


(Sawyer47) #4

Jest zbędne, ale spwmarluk utrzymywał, że powoduje u niego jakieś problemy, więc poprosiłem o komunikaty :wink:

Do spwmarluk: jeśli stosujesz już using namepasce std to wystarczy zapisać ios_base::nazwa_flagi lub krócej ios::nazwa_flagi


([alex]) #5

Bo pewnie próbował dać using std::ios_base; a potem używać samo app.


(Spwmarluk) #6

Nie użyłem nigdzie w kodzie 'using namespace std;'

Po przeczytaniu Waszych postów wkleiłem samą funkcję i skompilowałem i okazało się, że nie ma błędów. Po prostu nie wiem dlaczego jak wcześniej wstawiałem linię 'using std::ios_base;' to nie chciało się skompilować i dostawałem komunikat, że app nie zostało zadeklarowane.

#include 

#include 

#include 


using std::string;

using std::ofstream;

using std::cerr;

using std::endl;

using std::ios_base;


bool zapisz(string nazwa, string tekst)

{

   char *nplik = new char[nazwa.length()+1];

   strcpy ( nplik , nazwa.c_str());

   ofstream plik(nplik, ios_base::app);

   if (!plik)

   {

      cerr << "Blad pliku '" << nplik << "'" << endl;

      return false;

   }

   plik << tekst << endl;

   plik.close();

   return true;

}


int main()

{

   return 0;

}

Czy nie zrobi to żadnej różnicy, jak użyję tylko 'using namespace std;' a resztę wytnę ?

Gdzieś kiedyś wyczytałem, że może to powodować pewne problemy, oczywiście już nie pamiętam jakie, ale przyzwyczaiłem się do formy 'using std:: ...'

Chyba masz rację, bardzo możliwe, że tak na początku napisałem i to było powodem problemów.

Dzięki za pomoc.