2015-11-10 2 views
-2

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

вот .h файл

#ifndef COURSE_H 
#define COURSE3_H 
class course3 
{ 
string coursename; 
int courseid; 
int passinggrade; 
int numcredits; 
public: 
course3(string acoursename, int acourseid, int apassinggrade,int anumcredits); 
string getcoursename(); 
int getcouseid(); 
int getpassinggrade(); 
int getnumcredits(); 
}; 

и вот каст ...

#include <stdafx.h> 
#include <iostream> 
#include <string> 
#include <course3.h> 
using namespace std; 
course3::course3(string acoursename, int acourseid, int apassinggrade,int anumcredits) //constructors 
{ 
    coursename=acoursename; 
    courseid=acourseid; 
    passinggrade=apassinggrade; 
    numcredits=anumcredits; 
} 
string course3::getcoursename() 
{ 
    return coursename; 
} 
int course3::getcourseid() 
{ 
    return courseid; 
} 
int course3::getpassinggrade() 
{ 
    return passinggrade; 
} 
int course3::getnumcredits() 
{ 
    return numcredits; 
} 

} 

я делаю что-то неправильно?

ошибки:

ошибка C2146: синтаксическая ошибка: отсутствует ';' перед идентификатором 'coursename'

ошибка C4430: отсутствует спецификатор типа - int. Примечание: C++ не поддерживает по умолчанию-ИНТ

и многое другое, но близко к этим

+1

* Где * вы получаете ошибки? В каких файлах? На каких линиях? –

+0

хорошо, так что я переместил строку и с помощью патезрасе в час файл и все стало лучше .... еще 2 ошибки Ошибка \t \t 1 фатальная ошибка C1070: несоответствующие # если/# ENDIF пара в файле «C: \ пользователи \ ridahel \ documents \ visual studio 2008 \ projects \ class course новая копия \ курс курс новая копия \ course3.h '\t c: \ users \ ridahel \ documents \ visual studio 2008 \ projects \ class course new copy \ class course new copy \ course3.h как по строке 18 –

+0

1) #define не соответствует #ifndef –

ответ

2

Ваш защитник заголовка в файле .h объявлен неверным, и для него отсутствует #endif.

#include <string> принадлежит к файлу .h, так как вы используете std::string в файле .h.

Если вы хотите использовать string вместо std::string в файле .h, то using заявление должно быть в файле .h, а также. Но вы должны научиться избегать using namespace std;, поскольку он сбрасывает полное пространство имен std в глобальное пространство имен. Хотя он работает, он не является оптимальным или желательным. Если вы не хотите указывать std:: везде, где используется std::string, вы можете, по крайней мере, ограничить область действия инструкции using через using std::string;.

У вас есть дополнительный } в конце .cpp-файла, который там не принадлежит.

Попробуйте это:

#ifndef COURSE3_H 
#define COURSE3_H 

#include <string> 

class course3 
{ 
    std::string coursename; 
    int courseid; 
    int passinggrade; 
    int numcredits; 
public: 
    course3(std::string acoursename, int acourseid, int apassinggrade, int anumcredits); 
    std::string getcoursename(); 
    int getcourseid(); 
    int getpassinggrade(); 
    int getnumcredits(); 
}; 

#endif 

#include <stdafx.h> 
#include <iostream> 
#include "course3.h" 

course3::course3(std::string acoursename, int acourseid, int apassinggrade, int anumcredits) //constructors 
{ 
    coursename = acoursename; 
    courseid = acourseid; 
    passinggrade = apassinggrade; 
    numcredits = anumcredits; 
} 

std::string course3::getcoursename() 
{ 
    return coursename; 
} 

int course3::getcourseid() 
{ 
    return courseid; 
} 

int course3::getpassinggrade() 
{ 
    return passinggrade; 
} 

int course3::getnumcredits() 
{ 
    return numcredits; 
} 

Или:

#ifndef COURSE3_H 
#define COURSE3_H 

#include <string> 
using std::string; 

class course3 
{ 
    string coursename; 
    int courseid; 
    int passinggrade; 
    int numcredits; 
public: 
    course3(string acoursename, int acourseid, int apassinggrade, int anumcredits); 
    string getcoursename(); 
    int getcourseid(); 
    int getpassinggrade(); 
    int getnumcredits(); 
}; 

#endif 

#include <stdafx.h> 
#include <iostream> 
#include "course3.h" 

course3::course3(string acoursename, int acourseid, int apassinggrade, int anumcredits) //constructors 
{ 
    coursename = acoursename; 
    courseid = acourseid; 
    passinggrade = apassinggrade; 
    numcredits = anumcredits; 
} 

string course3::getcoursename() 
{ 
    return coursename; 
} 

int course3::getcourseid() 
{ 
    return courseid; 
} 

int course3::getpassinggrade() 
{ 
    return passinggrade; 
} 

int course3::getnumcredits() 
{ 
    return numcredits; 
} 
+0

СПАСИБО! это сработало ! отлично подходит для работы с вами ... –

+0

Существуют различные мнения о том, следует ли использовать 'using namespace' в исходном файле (cpp), и я не обязательно вам не согласен с этим, но, пожалуйста, удалите предложение, говорящее« используя namespace std принадлежит файлу .h ". Это основная причина, по которой люди возражают против использования «использования пространства имен» в глобальной области видимости. – Excelcius

+0

@Excelcius: Если Rida хочет использовать 'string' вместо' std :: string' в файле '.h', в файле' .h' требуется инструкция 'using'. –

2

Использование #include "course3.h" вместо #include <course3.h>. Используя двойные кавычки, препроцессор будет искать заголовок в вашем локальном каталоге. В скобках он будет искать заголовок в заголовках системы.

Тогда в ваших охранниках включения есть опечатка. Я советую вам использовать #pragma once, если вы не хотите писать #ifndef... и т. Д., И рискуете совершить ошибку (сначала проверьте, поддерживает ли ваш компилятор VS, GCC с 3.4, Clang и другие).

+0

Обычные предупреждения с '#pragma once': не стандартная функция, поэтому не ожидайте поддержки компилятора. Ожидайте полной тишины и странных сообщений об ошибках, когда они не поддерживаются. Не используйте со сложной иерархией построения, используя сетевые ресурсы и символические ссылки. Не должно быть проблем со школьным заданием (простая среда сборки) с использованием MSVC (поддерживается «один раз»), но следите, не компилирует и не комментирует код с компилятором, который не поддерживает 'once'. – user4581301

+0

Вы правы. Но OP, являющийся новичком и использующий Visual Studio, '#pragma once' может быть очень полезным и интуитивным. –

+0

Согласитесь, но убедитесь, что человек, выполняющий маркировку, использует компилятор, поддерживающий расширение. – user4581301

0

Ответ пров исправлено, но есть опечатка во имя функции getcourseid декларация и реализация функции

+0

да спасибо, я увидел его и зафиксировал –