3

我有两个名为 file_utils.h 和 file_utils.cpp 的文件,其中包含一些由不同类使用的方法和变量。这是它的外观示例:

file_utils.h:

namespace my_namespace
{
extern Foo* foo;
extern Bar* bar;

void my_function(Blah* blah);
}

文件实用程序.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错误。问题是什么?从设计的角度来看,这甚至是一个好主意,还是我应该尝试使用具有静态成员和方法的类?

4

2 回答 2

7

问题是您仅声明未定义变量。

您需要在单个实现文件中提供定义:

文件实用程序.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;
    //...
}
于 2012-06-20T15:32:25.417 回答
0

首先,我真的建议您澄清两个区别:

  • 声明与定义
  • 编译器与链接器

在您的情况下,您会收到链接器错误。未定义的引用意味着您的代码指向某个地方,但链接器无法确定在哪里。

当您使用在代码中某处找到的对象时,extern 关键字用于抑制编译器错误。在您的示例中,链接器尝试查找您的类的实例但失败了。这不常与指针一起使用(如果我错了,请纠正我)。所以:

实用程序.h

namespace mySpace{
    extern Foo foo; // notes that foo of type Foo will be used.

    void myFn();
}

实用程序.cpp

#include "utils.h"

void mySpace::myFn(){
    foo.bar = 5; // changes a member of foo from globals.cpp
}

全局变量.cpp

Foo mySpace::foo; // this is the actual foo used.

如果您希望回答有关 some_class.cpp 的问题,请向社区提供有关conversions您想要实现的目标和目标的知识。

从语义上看,我相信它是对一个类成员的引用conversions

于 2012-06-20T15:50:51.627 回答