ошибка C2039: 'строка': не член 'станд.', проблемы заголовочного файла

У меня есть проблемы с классом, который я пишу. Я разделил класс на.h файл, который определяет класс и .cpp файл, который реализует класс.

Я получаю эту ошибку в Экспрессе Visual Studio 2010 года:

ошибка C2039: 'строка': не член 'станд.'

Это - заголовок 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++.

32
задан Cal 25 June 2010 в 22:22
поделиться

2 ответа

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

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

26
ответ дан 27 November 2019 в 20:41
поделиться

Вам также необходимо иметь

#include <string>

в файле заголовка. Самого по себе прямого объявления недостаточно.

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

#ifndef THE_FILE_NAME_H
#define THE_FILE_NAME_H

/* header goes in here */

#endif

Это предотвратит включение файла заголовка несколько раз, если у вас нет такой защиты, тогда у вас могут быть проблемы с несколькими объявлениями.

27
ответ дан 27 November 2019 в 20:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: