2010-06-25 3 views
23

J'ai des problèmes avec une classe que j'écris. J'ai divisé la classe en un fichier .h qui définit la classe et un fichier .cpp qui implémente la classe.erreur C2039: 'chaîne': n'est pas un membre de 'std', problème de fichier d'en-tête

Je reçois cette erreur dans Visual Studio 2010 Express:

erreur C2039: 'string': n'est pas membre du 'std'

Ceci est l'en-tête FMAT.h

class string; 

class FMAT { 
public: 
    FMAT(); 

    ~FMAT(); 

    int session();    

private: 
    int manualSession();  
    int autoSession();  

    int  mode;  
    std::string instructionFile;  

}; 

Ceci est le fichier de mise en œuvre FMAT.cpp

#include <iostream> 
#include <string> 
#include "FMAT.h" 

FMAT::FMAT(){ 

    std::cout << "manually (1) or instruction file (2)\n\n"; 
    std::cin >> mode; 
    if(mode == 2){ 
     std::cout << "Enter full path name of instruction file\n\n"; 
     std::cin >> instructionFile; 
    } 

} 

int FMAT::session(){ 

    if(mode==1){ 
     manualSession(); 
    }else if(mode == 2){ 
     autoSession(); 
    } 

    return 1; 
} 

int FMAT::manualSession(){ 
    //more code 
    return 0; 
} 

c'est le fichier principal qui utilise cette classe 01 Mon incapacité à corriger cette erreur est probablement due au fait que je ne comprends pas comment structurer correctement une classe en fichiers séparés. N'hésitez pas à donner quelques conseils sur la gestion de plusieurs fichiers dans un programme C++.

+1

Vous vouliez probablement dire "déclare une classe" au lieu de "définit". –

Répondre

19

Vous devez avoir

#include <string> 

dans le fichier d'en-tête too.The déclaration en avant sur son propre ne fait pas assez.

Considérez également fortement gardes en-tête pour vos fichiers d'en-tête pour éviter d'éventuels futurs problèmes que votre projet se développe. Donc, en haut faire quelque chose comme:

#ifndef THE_FILE_NAME_H 
#define THE_FILE_NAME_H 

/* header goes in here */ 

#endif 

Cela empêchera le fichier d'en-tête d'être #include plusieurs fois, si vous ne disposez pas d'une telle protection, vous pouvez avoir des problèmes avec de multiples déclarations.

21

Votre FMAT.h nécessite une définition de std :: string pour compléter la définition de la classe FMAT. Dans FMAT.cpp, vous l'avez fait par #include <string> avant #include "FMAT.h". Vous ne l'avez pas fait dans votre fichier principal.

Votre tentative de transfert a déclaré que string était incorrecte sur deux niveaux. Vous devez d'abord avoir un nom complet, std::string. Deuxièmement cela ne fonctionne que pour les pointeurs et les références, pas pour les variables du type déclaré; une déclaration forward ne donne pas assez d'informations au compilateur sur ce qu'il faut intégrer dans la classe que vous définissez.

+0

Merci Mark, mettre #include dans le fichier .h résolu le problème. À mesure que la taille de ce programme augmente, vais-je rencontrer des problèmes en plaçant #include dans le fichier d'en-tête? J'avais entendu dire que le #includes devrait tous aller dans le fichier .cpp. Existe-t-il un moyen approprié de structurer le programme de sorte que je ne rencontre pas plus tard de multiples problèmes de définition? Le programme tel qu'il existe actuellement (aveC#include dans le fichier d'en-tête) est-il correctement structuré? – Cal

+0

Une solution consiste à avoir une dépendance sur '' et de forcer toutes les sources qui incluent 'FMAT.h' à l'inclure également. Chaque fichier d'inclusion doit inclure des gardes pour empêcher plusieurs définitions même si l'inclusion est faite plusieurs fois. –

+0

@Cal C'est généralement une bonne pratique pour inclure dans le fichier .cpp si possible. Cependant, ce n'est pas une règle qui peut être appliquée partout. Il y a plusieurs situations où ce n'est pas possible. C'est l'un d'eux. – TheUndeadFish

Questions connexes