2015-10-20 2 views
0

Вот мой file.h:Объявите тип строки в классе (C++)

#define MAXCOMPONENTS 20 
#include <string> 
#include <string.h> 
#include <iostream> 
class file{ 
public: 
    file(char const * filename); 
    virtual ~file(); 

    void Takeinfocomponents(); 
    void Takeshape(); 

    void Getvalue(int i); 
    char *Getcomponents(); 
    char *Getcolor(); 


protected: 
private: 
    char const * filename; 
    String shape; 
    int value[MAXCOMPONENTS]; 
    char components[MAXCOMPONENTS]; 
    char color[MAXCOMPONENTS]; 

}; 

И мой file.cpp:

#include <fstream> 
#include <iostream> 
#include <string.h> 
#include <string> 
#include "file.h" 
using namespace std; 

file::file(char const* filename) 
{ 
    cout << "constructor/fichier:" << filename << endl; 
    ifstream fichier(filename,ios::in); 
    if(fichier){ 
     this->filename=filename; 
     fichier.close(); 
     Takeshape(); 
     Takeinfocomponents(); 
    }else{ 
     cout << "File name invalid." << endl; 
    } 
} 

file::~file() 
{ 

} 

char* file::Getcolor(){ 
    return this->color; 
} 

char* file::Getcomponents(){ 
    return this->components; 
} 

void file::Getvalue(int i){ 
    cout << this->value[i] << endl; 
} 


void file::Takeinfocomponents(){ // pic up name of components, his number and his color 
    cout << "Takeinfocomponents/fichier:" << filename << endl; 
    ifstream fichier(this->filename,ios::in); 
    ifstream stop(this->filename,ios::in); 
    string line; 
    int i=0; 
    getline(fichier,line); 
    getline(stop,line); 
    getline(stop,line); 
    while(line!="/" && i!=99){ // take all informations while the stop signal isn't read 
     getline(stop,line); 
     fichier >> this->components[i] >> this->value[i] >> this->color[i]; 
     cout << this->components[i] << this->value[i] << this->color[i] << endl; 
     i++; 
    } 
    fichier.close(); 
} 

void file::Takeshape(){ // pic up the shape in .txt 
    cout << "Takeshape" << endl; 
    fstream fichier(this->filename,ios::in); 
    string shape; 
    fichier >> shape; 
    this->shape=shape; 
    fichier.close(); 
} 

Это является частью более крупной программы, которые делают графический из информации (из .txt), эта часть используется для отображения информации из .txt.

Проблема приходят из декларации из:

String shape; 

Он сказал мне, что строка не имя типа. Я пробовал с небольшим «с»:

string shape; 

Но это не работает. У меня сложилось впечатление, что я пропускаю очень маленькие вещи, которые могут разблокировать мою проблему. Thx для справки.

Notabene: Я французский, и мой английский не так уж хорош, ответьте, как будто я был маленьким ребенком ахей!

+5

вы, вероятно, хотите 'станд :: string'. –

+0

Просто для продолжения комментария @ MarkRansom: это о пространствах имен C++. Это даст вам хороший обзор: http://www.cprogramming.com/tutorial/namespaces.html –

+0

Whoa thx много! Но я не знаю, почему мы должны поставить «std ::» –

ответ

1

Вы должны явно указать пространство имен:

std::string shape; 

Вы не должны загрязнять пространство имен в заголовках, так using namespace std не вариант здесь.

См. Также question об загрязнении пространства имен. Если вам просто нужны строки, предпочитайте использовать

using std::string; 

в файле cpp.

0

C++ использует концепцию namespace. Пространство имен используется для группировки типов, переменных и т. Д. Вместе значимым образом, независимо от количества файлов заголовков, с которыми эти типы или переменные распространяются.

В этом примере тип строки находится внутри пространства имен std. std коротка для стандартной библиотеки шаблонов, и это пространство имен, большинство из библиотеки классов С ++ и т.д., хранятся в.

Правильный способ доступа типа внутри пространства имен является namespace::type, поэтому правильный способ доступа к string тип внутри пространства имен std - std::string. Вы также можете написать using namespace std для доступа к типам в std без необходимости писать std:: каждый раз, но выполнение этого в глобальной области - плохая идея, поскольку она загрязняет глобальное пространство имен.

В коде, который вы отправили, появляется string shape; перед using namespace std, так как перед ним стоит #include "file.h". Поэтому он не вступает в силу.

0

Чтобы иметь возможность использовать класс строк и создавать строковые объекты, вам необходимо включить ...

#include <string> 

... в верхней части ваших заголовочных файлов.

Вам не нужно ...

#include <string.h> 

Класс string, как и все классы STL, является частью пространства имен std. Если вы не хотите писать зЬй :: перед каждым именем класса, вы можете просто состояние ...

using namespace std; 

... в верхней части ваших заголовочных файлов, так что вместо того, чтобы ...

std::string shape; 

... вы можете просто использовать ...

string shape; 
Смежные вопросы