C ++ 11 множественные определения функции класса

РЕШЕНО: Я полный тупик. После тщательной проверки всех файлов и отслеживания с помощью нашего собственного генератора файлов зависимостей выясняется, что на самом деле имелись несанкционированные включения .cpp, которые недавно были добавлены в файловую систему, и это стало причиной проблемы. Извините, и спасибо всем за помощь всем! XD

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

//foo.h
#pragma once

class foo
{
public:
foo();
~foo();
void random_function();
};

Обратите внимание, что я объявил прагму один раз, чтобы предотвратить несколько определений, и все прототипы функций помещаются в определение класса. Соответствующий класс определяется так:

// foo.cpp
#include "foo.h"
foo::foo() {
}

foo::~foo(){
}

void foo::random_function(){
//do stuff
}

Этот класс используется во многих других файлах. Например:

// bar.h
#include “foo.h”

class bar
{
bar();
~bar();
std::shared_ptr<foo> get_foo();
std::shared_ptr<foo> my_foo;
};

Но когда я компилирую, я получаю следующую ошибку для каждого члена функции определения класса:

bar.o: In function `foo:foo()':
dir/foo.cpp:80: multiple definition of `foo::foo()'
blah.o:dir/foo.cpp:80: first defined here
bar.o: In function `foo:foo()':
dir/foo.cpp:80: multiple definition of `foo::foo()'
blah.o:dir/foo.cpp:80: first defined here

Обратите внимание, как кажется, что одна и та же ошибка в 3 строки повторяется дважды подряд. Этот же шаблон ошибки повторяется для каждого объявления конструктора / деструктора / функции. Также обратите внимание, как кажется, что функция foo () в foo.cpp сначала определяется в foo.cpp, что, кажется, не имеет особого смысла. Но я только заметил, что это начинается с bar.o, а затем говорит blah.o …?

На самом деле, почесывая голову, не могу понять, откуда возникла проблема или куда я должен посмотреть. Любая помощь будет принята с благодарностью! : D

Дополнения:

  • Я не могу опубликовать оригинальный код, потому что это из моей работы. Я надеюсь, что этого примера фрагмента достаточно, чтобы по крайней мере дать некоторое указание относительно того, где я, вероятно, должен начать искать, за исключением любых проблем с кодом, как он настроен в данный момент.
  • Я не включаю никакие файлы .cpp в другом месте кода. Я включаю только .h.
  • Исходный код имеет точку с запятой в конце объявления класса файла заголовка, просто забыл включить в пример, размещенный здесь. Обновлено, чтобы отразить это.
  • Включение файла foo.h одинаково для всех файлов (без случайного смешанного регистра).
  • Другие аналогично определенные классы используют этот точно такой же шаблон, но странным образом не генерируют ту же ошибку. 😕
  • Повторюсь, я уверен, что я не # включаю никакие файлы .cpp где-либо в моей программе, только заголовочные файлы когда-либо включаются в другие части программы.
  • Я также уверен, что конструктор объявлен в заголовочном файле как foo (); как в приведенном выше примере кода, а не foo () {}.
  • Компилятор поддерживает прагму один раз (используя g ++).
  • Исправлена ​​другая опечатка в приведенном выше примере, не найденная в исходном коде (кавычки вокруг заголовка файла)
  • Система, над которой я работаю, на самом деле довольно большая. Есть много включений и зависимостей по всему коду (даже некоторые циклические зависимости) и использование некоторых синглетонов, которые передаются по всей системе. Приведенный выше пример представляет собой упрощенное представление проблемы, с которой я сталкиваюсь на самом фундаментальном уровне. Я вижу вышеупомянутую ошибку, которая фактически генерируется для ряда новых файлов, которые я объединяю в систему (не только для одного) , Странно, но другие файлы, которые я определил подобным образом, не создавали и до сих пор не создавали эту проблему, поэтому я запутался в том, что теперь это вызывает проблемы.

0

Решение

Попробуйте добавить в foo.h

#ifndef FOO_H
#define FOO_H

//foo class and stuff

#endif
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]