我有两个名为file_utils.h和file_utils.cpp的文件,其中包含一些由不同类使用的方法和变量。以下是它的外观示例:
file_utils.h:
namespace my_namespace
{
extern Foo* foo;
extern Bar* bar;
void my_function(Blah* blah);
}
file_utils.cpp
#include "file_utils.h"
void my_namespace::my_function(Blah* blah)
{
foo = 0; // undefined reference to my_namespace::foo
bar = 0; // undefined reference to my_namespace::bar
//...
}
some_class.cpp
#include "file_utils.h"
some_function()
{
my_namespace::my_function(blah);
this->foo = *my_namespace::foo; // will that work ok?
}
所以错误在评论中。如果我删除了extern关键字,我会收到multiple definition of my_namespace::foo
错误。问题是什么?从设计的角度来看,这是一个好主意,还是我应该尝试使用静态成员和方法的类?
答案 0 :(得分:7)
问题是你只是声明而不是定义了变量。
您需要在单个实现文件中提供定义:
<强> file_utils.cpp 强>
#include "file_utils.h"
//definition:
namespace my_namespace
{
Foo* foo;
Bar* bar;
}
//alternatively, to keep the same formatting you have
//Foo* my_namespace::foo;
//Bar* my_namespace::bar;
void my_namespace::my_function(Blah* blah)
{
foo = 0;
bar = 0;
//...
}
答案 1 :(得分:0)
首先,我会真的建议您澄清两个不同之处:
在您的情况下,您会收到链接器错误。未定义的引用意味着您的代码指向某处,但链接器无法找出位置。
当您使用代码中某处找到的对象时,extern关键字用于抑制编译器错误。在您的示例中,链接器尝试查找类的实例但失败。这不常用于指针(如果我错了,请纠正我)。 因此:
<强> utils.h 强>:
namespace mySpace{
extern Foo foo; // notes that foo of type Foo will be used.
void myFn();
}
<强> utils.cpp 强>:
#include "utils.h"
void mySpace::myFn(){
foo.bar = 5; // changes a member of foo from globals.cpp
}
<强> globals.cpp 强>
Foo mySpace::foo; // this is the actual foo used.
如果您想解答有关some_class.cpp的问题,请向社区提供有关conversions
以及您希望实现的内容的知识。
从语义来判断我认为它是对班级成员conversions
的引用。