У вас неправильная структура файла.
Неопределенные объявления принадлежат заголовочному файлу (.h
или .hpp
, заканчивающийся соглашением):
// HelloWorld.h
// No standard library headers required, because you don't use anything from `std::`
class HelloWorld{
public:
void printHelloWorld();
};
(Не встроенные) определения принадлежат исходному файлу (.cpp
или .cxx
или .cc
по соглашению):
// HelloWorld.cpp
#include "HelloWorld.h"
#include <iostream>
// #include<string> is not needed, since you don't use `std::string` here
void HelloWorld::printHelloWorld() {
std::cout << "This is the world" << std::endl;
}
и исходные файлы не должны включаться в другие файлы. Должны быть включены только заголовочные файлы с объявлениями:
#include "HelloWorld.h"
int main(){
HelloWorld helloWorld;
helloWorld.printHelloWorld();
return 0;
}
Каждый исходный файл по соглашению компилируется как отдельная единица перевода, и определение функции (не встроенной) может быть только в один единиц перевода.
#include
по сути не более чем копирует и вставляет код из другого файла в файлы, использующие его. Таким образом, если вы включите .cpp
с определением в другой файл .cpp
, то оба модуля перевода для двух файлов .cpp
будут содержать определение, нарушающее упомянутое выше правило одного определения.
Ваша ошибка говорит о том, что у вас есть определение для HelloWorld::printHelloWorld()
(которое не является встроенным) в двух единицах перевода.