Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

STRING typem wbudowanym?

Ostatnio zmodyfikowano 2017-11-30 12:09
Autor Wiadomość
lukasz427
Temat założony przez niniejszego użytkownika
STRING typem wbudowanym?
» 2017-10-05 20:16:31
Cześć.

Właśnie zauważyłem, że nie muszę dodawać nagłówka biblioteki string (dyrektywą #include<string>), kiedy używam w programie obiektów klasy string.Czy robi to za mnie środowisko?
Dodam że używam najnowszej wersji Code::Blocks?
Nie powiem,że mi to przeszkadza niemniej jednak jestem dociekliwy.

Dodatkowo jeśli usunę nagłówek biblioteki iostream( #include <iostream>).Błąd pojawia się już w momencie tworzenia obiektu klasy string.
Czy zatem biblioteka string została dołączona do biblioteki iostream?

Z góry dzięki.


Łukasz
P-165463
Kinexity
» 2017-10-05 20:24:25
string nie jest typem wbudowanym. W VS w nagłówku xstring (pewnie w CB jest coś podobnego) masz coś takiego:

C/C++
typedef basic_string < char, char_traits < char >, allocator < char > >
string;

Ale ten nagłówek nie jest połączony z definicją tej klasy, więc tak czy siak musisz załączyć <string>. (nie wiem czy to co napisałem jest właściwą i czy jest w pełni prawidłowo napisane)
P-165465
lukasz427
Temat założony przez niniejszego użytkownika
» 2017-10-05 20:34:53


Może jeszcze dodam kod, który pochodzi z "symfonii".
Wszystko działa.


C/C++
#include <iostream>
using namespace std;



int main()
{
   
    string poemat;
    unsigned int poprz_poj = poemat.capacity();
   
   
    for( int i = 1; i < 500; i++ )
    {
        poemat += 'A';
        unsigned int akt_poj = poemat.capacity();
        if( akt_poj != poprz_poj )
        {
            cout << "Gdy liter k: " << i << " Zwiekszylem pojemnosc do: " << akt_poj
            << "(+" << akt_poj - poprz_poj << ")" << endl;
            poprz_poj = akt_poj;
           
        }
    }
   
   
}
P-165466
mateczek
» 2017-10-05 21:14:16
jeśli nie piszesz programów na wiele platform jednocześnie to się tematem nie musisz przejmować. A kompilując na różne platformy. Windows, Android, Linux, czy RasberyPI, W końcu i tak będziesz musiał dołączyć includy jak przystoii.
P-165469
pekfos
» 2017-10-07 13:02:18
Widocznie w <iostream> gdzieś jest dołączone <string>. Pod innym kompilatorem nie musi to zachodzić i program się nie skompiluje.
P-165497
kmlkamilek
» 2017-11-29 23:40:21
Podobne pytanie padło na stackoverflow: "Do I have to include string beside iostream?"
Najbardziej punktowana odpowiedź odpowiada na twoje pytanie, jednocześnie mówiąc ci o jednej z dobrych praktyk w C++.

Yes, you have to include what you use. It's not mandated that standard headers include one another (with a few exceptions IIRC). It might work now, but might fail on a different compiler.

In your case, apparently <iostream> includes <string>, directly or indirectly, but don't rely on it.

Do tego jeszcze opis z dokumentacji:

Including <iostream> automatically includes also <ios>, <streambuf>, <istream>, <ostream> and <iosfwd>.

Więc jak widzisz, iostream w twoim wypadku, dołączył nagłówek ze stringiem, ale standard tego nie gwarantuje.
P-167404
YooSy
» 2017-11-30 12:09:58
Pod innym kompilatorem nie musi to zachodzić i program się nie skompiluje.
np. W Visual Studio przejdzie deklaracja stringa przy załączonym iostream, ale już przy użyciu obiektu ze strumieniami przy kompilacji pojawia się błąd. Dobrze jest dodawać pliki nagłówkowe, których klas się używa, niż liczyć na fart.
P-167418
« 1 »
  Strona 1 z 1