Очевидно, что вы пришли из Java, потому что вы еще не поняли концепцию заголовочных файлов. В Java процесс определения чего-либо обычно выполняется одним куском. Вы объявляете и определяете одновременно. В C / C ++ это двухэтапный процесс. Объявление что-то говорит компилятору "что-то существует с этим типом, но я расскажу вам позже, как это на самом деле реализовано". Определение что-то дает компилятору фактическую часть реализации. Заголовочные файлы используются в основном для объявлений, файлы .cpp для определений.
Заголовочные файлы предназначены для описания «API» классов, но не для их реального кода. Можно включить код в заголовок, который называется встраиванием в заголовок. Вы вставили все в CppClass.cpp (что не очень хорошо, включение заголовка должно быть исключением), а затем вы объявляете свой класс в main.cpp AGAIN, который является двойным объявлением в C ++. Встраивание в тело класса приводит к дублированию кода каждый раз, когда вы используете метод (это только звучит безумно. Подробности см. В разделе C ++ faq по встраиванию .)
Включение двойного объявления в ваш код приводит к ошибке компилятора. Выход из кода класса компилируется, но выдает ошибку компоновщика, потому что теперь у вас есть только заголовочное объявление класса в main.cpp. Компоновщик не видит кода, реализующего ваши методы класса, поэтому появляются ошибки. В отличие от Java, компоновщик C ++ НЕ будет автоматически искать объектные файлы, которые он хочет использовать. Если вы используете класс XYZ и не предоставляете ему объектный код для XYZ, он просто потерпит неудачу.
Пожалуйста, взгляните на статью заголовочного файла Википедии и Шаблоны заголовочных файлов (ссылка также находится внизу статьи Википедии и содержит больше примеров)
Короче говоря:
Для каждого класса создайте файлы NewClass.h и NewClass.cpp.
В файле NewClass.h напишите:
class NewClass {
public:
NewClass();
int methodA();
int methodB();
}; <- don't forget the semicolon
В файле NewClass.cpp напишите:
#include "NewClass.h"
NewClass::NewClass() {
// constructor goes here
}
int NewClass::methodA() {
// methodA goes here
return 0;
}
int NewClass::methodB() {
// methodB goes here
return 1;
}
В main.cpp напишите:
#include "NewClass.h"
int main() {
NewClass nc;
// do something with nc
}
Чтобы связать все это вместе, сделайте
g ++ -o NewClassExe NewClass.cpp main.cpp
(просто пример с gcc)