Переопределение в C ++, предыдущее определение в заголовочном файле?

0

Поэтому я смущен. Я получаю ошибку переопределения при попытке реализовать метод, ранее объявленный в файле заголовка. Я добавил включить охранников в заголовок и по-прежнему получил ту же ошибку. Если бы кто-то мог объяснить мне, что я не вижу, это было бы фантастически.

В файле, включенном в main.cpp: 2:./thing.cpp:7:12: ошибка: переопределение "метода" int Thing :: method (void) ^./thing.hpp:12:6: note: предыдущее определение здесь int method (void) {}; ^

--РЕДАКТИРОВАТЬ--

Теперь я получаю следующее:

дублирующий символ __ZN5Thing6methodEv в: main.o thing.o ld: 1 дубликат символа для архитектуры x86_64

thing.hpp:

#ifndef THING_H
#define THING_H

class Thing {

public:
        int a;
        int b;
        char c;

        int method(void) {};
        Thing(int anA, int aB, char aC): a(anA), b(aB), c(aC) {};


};

#endif

thing.cpp

#include <iostream>
#include <stdio.h>
#include "thing.hpp"

using namespace std;

int Thing::method(void)
{
        return 5;

}

main.cpp

#include <iostream>
#include "thing.cpp"

using namespace std;

Thing* thing = new Thing(5,5,'c');

int main(int argc, char ** argv)
{
        cout << thing->method() <<endl;

}
  • 1
    почему вы включаете thing.cpp в main.cpp?
Теги:
header
guard
include

2 ответа

7
Лучший ответ

В вашем файле заголовка:

int method(void) {};

Это встроенное определение, а не декларация. {} Фактически предоставляет кумулятивную функцию (хотя и пустую) компилятору. Удалите {} если вы хотите определить функцию в другом файле.

Кроме того, у вас есть #include "thing.cpp" а не #include "thing.hpp" в верхней части файла main.cpp.

1

В main.cpp вам нужно изменить:

#include "thing.cpp"

чтобы:

#include "thing.hpp"

Ещё вопросы

Сообщество Overcoder
Наверх
Меню