Дублирующая символьная функция в C ++ - PullRequest
0 голосов
/ 16 апреля 2020

У меня нижеприведенный main() вызов функции в Hello. cpp

#include "HelloWorld.cpp"

int main(){
HelloWorld helloWorld;
helloWorld.printHelloWorld();
return 0;
}

Другой включенный файл c ++ имеет следующий код:

#include <iostream>
#include <string>

class HelloWorld{
        public:
        void printHelloWorld();
};

void HelloWorld::printHelloWorld() {
    std::cout << "This is the world" << std::endl;
}

Когда Я выполняю с XCode, я вижу дубликаты символов для printHelloWorld.

duplicate symbol 'HelloWorld::printHelloWorld()' in: Hello.o HelloWorld.o

ld: 1 duplicate symbol for architecture x86_64

Как я могу исправить вышеуказанную проблему?

1 Ответ

2 голосов
/ 16 апреля 2020

У вас неправильная структура файла.

Неопределенные объявления принадлежат заголовочному файлу (.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() (которое не является встроенным) в двух единицах перевода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...