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

[C++] <cstring> i własne namespace

Ostatnio zmodyfikowano 2010-07-27 14:05
Autor Wiadomość
programator
Temat założony przez niniejszego użytkownika
[C++] <cstring> i własne namespace
» 2010-07-26 11:51:20
Witam,
mam takie pliki:
C/C++
//main.cpp
#include <iostream>
#include "terminal_master.hpp"
using namespace std;
int main()
{
    string temp( "432" );
    cout << TM::str2int( temp ) << endl;
}

C/C++
//terminal_master.hpp
#ifndef TERMINAL_MASTER_HPP
#define TERMINAL_MASTER_HPP

using namespace std;
#include <cstring>
namespace TM
{
    string int2str( int );
    int str2int( string );
}
#endif

C/C++
//terminal_master.cpp
#include "terminal_master.hpp"

#include <cstring>

using namespace std;

namespace TM
{
    string int2str( int liczba )
    {
        stringstream ss;
        ss << liczba;
        string tekst;
        ss >> tekst;
        return( tekst );
    }
    int str2int( string tekst )
    {
        stringstream ss;
        ss << tekst;
        int liczba;
        ss >> liczba;
        return( liczba );
    }
} //namespace TM

Wywala błędy:
/home/pawel/Pulpit/terminal_master.hpp|8|error: ‘string’ does not name a type|
/home/pawel/Pulpit/terminal_master.hpp|9|error: ‘string’ was not declared in this scope|
/home/pawel/Pulpit/terminal_master.cpp|9|error: ‘string’ does not name a type|
/home/pawel/Pulpit/terminal_master.cpp|17|error: redefinition of ‘int TM::str2int’|
/home/pawel/Pulpit/terminal_master.hpp|9|error: ‘int TM::str2int’ previously defined here|
/home/pawel/Pulpit/terminal_master.cpp|17|error: ‘string’ was not declared in this scope|
||=== Build finished: 6 errors, 0 warnings ===|
Czy ktoś wie jak mogę to naprawić?
P-20163
waxx
» 2010-07-26 12:15:56
dodaj includy string i sstream
P-20164
programator
Temat założony przez niniejszego użytkownika
» 2010-07-26 15:34:37
Hmm, rzeczywiście w pliku terminal_master.cpp zapomniałem o sstream:)
Ale nigdy bym nie pomyślał, że trzeba go też dołączyć do pliku hpp...
Dzięki wielkie, a mógłbyś napisać, dlaczego plik nagłówkowy potrzebuje sstream?
P-20169
malan
» 2010-07-26 16:47:02
Plik nagłówkowy potrzebuje string tylko. Plik źródłowy potrzebuje sstream (string już nie, bo dodałeś go w pliku nagłówkowym) :).
P-20173
waxx
» 2010-07-26 17:40:48
Dla porządku lepiej trzymać w nagłówkach wszystkie potrzebne includy. A w pliku implementacji klasy dołączać tylko headery klas/y.
P-20174
Elaine
» 2010-07-26 18:59:54
Dla porządku lepiej trzymać w nagłówkach wszystkie potrzebne includy. A w pliku implementacji klasy dołączać tylko headery klas/y.
Nieprawda. W nagłówku powinno się dołączać tylko i wyłącznie rzeczy wymagane przez nagłówek (a tych zwykle jest niewiele). Chyba, że chcesz sobie zafundować częste  rekompilacje całego projektu (w C++ to wyjątkowo mocno boli, bo język jest tak skonstruowany, że kompilacja jest bardzo wolna), wtedy jak najbardziej możesz dołączać wszystko w nagłówku :P

Poza tym, takie podejście ma jeszcze jedną "fajną" "zaletę" - po dołączeniu nagłówka napisanego w ten sposób dostajemy, poza deklaracjami i definicjami na których nam zależało, także milion innych rzeczy (por. namespace pollution) :>
P-20178
programator
Temat założony przez niniejszego użytkownika
» 2010-07-26 20:43:02
Hehe, nie pisał bym na forum, gdyby chodziło tylko o dodanie includa do pliku, który z niego korzysta:)
Po prostu nie napisałem go tutaj w pierwszym poście:)
Dla jasności:
C/C++
//main.cpp
#include <iostream>
#include "terminal_master.hpp"
using namespace std;
int main()
{
    string temp( "1234" );
    cout << TM::str2int( temp ) << endl;
}
C/C++
//terminal_master.hpp
#ifndef TERMINAL_MASTER_HPP
#define TERMINAL_MASTER_HPP

#include <cstring>
//#include <sstream>
using namespace std;

namespace TM
{
    string int2str( int );
    int str2int( string );
}
#endif
C/C++
//terminal_master.cpp
#include "terminal_master.hpp"
#include <cstring>
#include <sstream>
using namespace std;

namespace TM
{
    string int2str( int liczba )
    {
        stringstream ss;
        ss << liczba;
        string tekst;
        ss >> tekst;
        return( tekst );
    }
    int str2int( string tekst )
    {
        stringstream ss;
        ss << tekst;
        int liczba;
        ss >> liczba;
        return( liczba );
    }
}
I wyrzuca błędy:

/home/pawel/Pulpit/terminal_master.hpp|10|error: ‘string’ does not name a type|
/home/pawel/Pulpit/terminal_master.hpp|11|error: ‘string’ was not declared in this scope|
/home/pawel/Pulpit/terminal_master.cpp||In function ‘int TM::str2int(std::string)’:|
/home/pawel/Pulpit/terminal_master.cpp|16|error: ‘int TM::str2int(std::string)’ redeclared as different kind of symbol|
/home/pawel/Pulpit/terminal_master.hpp|11|error: previous declaration of ‘int TM::str2int’|
||=== Build finished: 4 errors, 0 warnings ===|
Jeżeli dodam do pliku hpp #include <sstream> kompiluje się i działa, tylko nie wiem dlaczego:)

EDIT:
Już chyba wiem:) klasa string potrzebuje do działania deklaracji zawartych w sstream...
Równie dobrze mogę dołączyć <iostream>, <istream>, <ostream> lub <fstream>....
P-20181
malan
» 2010-07-26 21:11:43
<< deleted by malan >>
P-20182
« 1 » 2
  Strona 1 z 2 Następna strona