C ++ 11类函数的多个定义

时间:2013-04-19 16:28:08

标签: c++ class function c++11 multiple-definition-error

决议:我是一个完整的doofus。在仔细阅读了所有文件并通过我们的专有依赖文件生成器追溯之后,事实证明确实存在最近被添加到文件系统中的流氓.cpp包含,这导致了问题。对不起,谢谢大家的帮助! XD

我遇到了一个令人沮丧的难题,我希望有人可以提供帮助。基本上,我在头文件中声明一个泛型类,如下所示:

//foo.h
#pragma once

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

请注意,我已经声明了一次pragma以防止多个定义,并且所有函数原型都放在类定义中。相应的类定义如下:

// 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.cpp中的函数foo()首先在foo.cpp中定义的,这似乎没有多大意义。但我只是注意到,它从bar.o开始然后说blah.o ......?

真的在这个问题上摸不着头脑,似乎无法破译问题的来源或我应该去哪里。任何帮助将不胜感激! :d

补遗:

  • 我无法发布原始代码,因为它来自我的工作。我希望这个示例代码段足以至少为我应该开始查看的位置指明一些方向,除非当前设置的代码存在任何问题。
  • 我没有在代码中的其他地方包含任何.cpp文件。我只包括.h。
  • 原始代码在头文件类声明结尾处有分号,只是忘记在此处发布的示例中包含。更新以反映这一点。
  • 包含foo.h在所有文件中都是一致的(没有意外的混合大小写)。
  • 其他类似定义的类正在使用这种完全相同的模式,但奇怪的是不会产生相同的错误。 :<?/ LI>
  • 重申一下,我确信我在程序的任何地方都没有#include任何.cpp文件,只有头文件才包含在程序的其他地方。
  • 我也确定构造函数在头文件中声明为foo();就像在上面的代码示例中一样,而不是foo(){}。
  • 编译器支持一次编译指示(使用g ++)。
  • 修复了原始代码中未找到的上述示例中的另一个拼写错误(标题文件名周围的引号)
  • 我正在研究的系统实际上非常庞大。整个代码中有许多包含和依赖(甚至一些循环依赖)以及在整个系统中传递的一些单例的使用。上面的例子是我在最基本的层面看到的问题的简化表示,我看到的上述错误实际上是为我合并到系统中的许多新文件生成的(不仅仅是一个) 。奇怪的是,我以类似的方式定义的其他文件并没有迄今为止没有产生过这个问题,这就是为什么我很困惑它现在似乎引起了问题。

1 个答案:

答案 0 :(得分:1)

尝试添加foo.h

#ifndef FOO_H
#define FOO_H

//foo class and stuff

#endif