У меня есть проблемы с классом, который я пишу. Я разделил класс на.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++.
Ваш FMAT.h требует определения std :: string для завершения определения класса FMAT. В FMAT.cpp это делается с помощью #include
до #include "FMAT.h"
. Вы не сделали этого в своем основном файле.
Ваша попытка переслать объявленную строку
была неправильной на двух уровнях. Сначала вам нужно полное имя std :: string
. Во-вторых, это работает только для указателей и ссылок, а не для переменных объявленного типа; предварительное объявление не дает компилятору достаточно информации о том, что нужно встраивать в определяемый вами класс.
Вам также необходимо иметь
#include <string>
в файле заголовка. Самого по себе прямого объявления недостаточно.
Также обязательно подумайте о защите заголовков для ваших файлов заголовков, чтобы избежать возможных проблем в будущем по мере роста вашего проекта. Итак, вверху сделайте что-нибудь вроде:
#ifndef THE_FILE_NAME_H
#define THE_FILE_NAME_H
/* header goes in here */
#endif
Это предотвратит включение файла заголовка несколько раз, если у вас нет такой защиты, тогда у вас могут быть проблемы с несколькими объявлениями.