2010-06-25 3 views
23

У меня проблемы с классом, который я пишу. Я разделил класс на файл .h, который определяет класс и .cpp-файл, который реализует класс.error C2039: 'string': не является членом 'std', проблема с файлом заголовка

Я получаю эту ошибку в Visual Studio 2010 Express: C2039

об ошибке: 'строка': не является членом 'Std'

Это заголовок FMAT.h

class string; 

class FMAT { 
public: 
    FMAT(); 

    ~FMAT(); 

    int session();    

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

    int  mode;  
    std::string instructionFile;  

}; 

Это файл реализации 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; 
} 

это главный файл, который использует этот класс

#include "FMAT.h" 

int main(void) 
{ 
    FMAT fmat;  //create instance of FMAT class 

    fmat.session();  //this will branch to auto session or manual session 

} 

Невозможность исправить эту ошибку, вероятно, является результатом того, что я не понимаю, как правильно структурировать класс в отдельные файлы. Не стесняйтесь приводить несколько советов о том, как обрабатывать несколько файлов в программе на C++.

+1

Возможно, вы имели в виду «объявляет класс» вместо «определяет». –

ответ

19

Вы должны иметь

#include <string> 

в файле заголовка too.The вперед декларации о своем собственном не делает достаточно.

Также настоятельно рекомендуем защищать заголовок для файлов заголовков, чтобы избежать возможных будущих проблем по мере роста вашего проекта. Таким образом, в верхней части сделать что-то вроде:

#ifndef THE_FILE_NAME_H 
#define THE_FILE_NAME_H 

/* header goes in here */ 

#endif 

Это предотвратит файл заголовок от того #included нескольких раз, если у вас нет такого охранника, то вы можете иметь проблемы с несколькими заявлениями.

21

Для вашего определения в FMAT.h требуется определение std :: string, чтобы завершить определение класса FMAT. В FMAT.cpp вы сделали это #include <string> до #include "FMAT.h". Вы не сделали этого в своем основном файле.

Ваша попытка переслать объявление string была неверна на два этажа. Сначала вам нужно полное имя, std::string. Во-вторых, это работает только для указателей и ссылок, а не для переменных объявленного типа; передняя декларация не дает компилятору достаточной информации о том, что вводить в класс, который вы определяете.

+0

Спасибо, Марк, положив #include в .h файл решил проблему. Поскольку эта программа растет в размерах, я столкнулся с проблемами, поставив #include в файл заголовка? Я слышал, что #includes все должны быть в .cpp-файле. Есть ли способ структурировать программу, чтобы позже я не столкнулся с несколькими проблемами определения. Является ли программа, как она существует сейчас (с #include в файле заголовка) структурирована правильно? – Cal

+0

Одним из решений является зависимость от '' и принудительно включить любой источник, который включает в себя' FMAT.h', чтобы включить его. Каждый файл include должен включать в себя защитные устройства для предотвращения множества определений, даже если включение выполняется несколько раз. –

+0

@Cal Это, как правило, хорошая практика для включения в файл .cpp, если это возможно. Однако это не правило, которое можно применять повсюду. Существуют различные ситуации, когда это невозможно. Это одна из них. – TheUndeadFish