只是为了澄清。不可能extern类:
class Outside
{
public:
Outside(int count);
GetCount();
}
但是,一旦您在 framework.cpp 中获得了可用的类,您就 CAN extern 一个 Outside 类型的对象。您需要一个 .cpp 文件来声明该变量:
#include "outside.h"
Outside outside(5);
然后您可以通过extern 在另一个文件中引用该对象(只要您在编译项目时链接到正确的对象文件):
#include "outside.h"
extern Outside outside;
int current_count = outside.GetCount();
extern 用于表示“我知道此程序运行时将存在具有此名称的这种类型的变量,我想使用它。”它适用于变量/对象,而不是类、结构、联合、typedef 等。它与static 对象没有太大区别。
您可能正在考虑前向声明类以减少编译时间,但对此有一些限制(您只能将对象用作不透明指针,并且不能在它们上调用方法)。
您也可能意味着对用户隐藏Outside 的实现。为此,您需要阅读 PIMPL 模式。
更新
一种可能是向 Outside.h 添加一个免费函数(我还添加了一个命名空间):
namespace X {
class Outside {
int count_;
public:
Outside(int count) : count_(count) { }
int GetCount()
{
return count_;
}
};
int GetOutsideCount(Outside* o);
}
在 .cpp 文件中实现该功能。当你这样做的时候,你不妨把你打算的全局变量 extern (注意,变量本身不需要是指针):
#include "outside.h"
namespace X {
int GetOutsideCount(Outside* o)
{
return o->GetCount();
}
}
X::Outside outside(5);
然后在您的程序中执行此操作(请注意,您不能在 outside 上调用任何方法,因为您没有包含 outside.h 并且您不想通过添加类的新定义来违反单一定义规则或那些方法;但由于定义不可用,您需要将指针传递给 outside 而不是 outside 本身):
namespace X {
class Outside;
int GetOutsideCount(Outside* o);
}
extern X::Outside outside;
int main()
{
int current_count = GetOutsideCount(&outside);
}
委婉地说,我认为这是可憎的。您的程序将找到GetOutsideCount 函数,通过传递Outside* 来调用它。 Outside::GetCount 实际上被编译为一个普通函数,它接受一个秘密 Outside 对象(在 Outside::GetCount 内,该对象通过 this 指针引用),所以 GetOutsideCount 会找到该函数,并告诉它取消引用传递给GetOutsideCount 的Outside*。我认为这就是所谓的“走很长的路”。
但事实就是如此。
如果您不习惯使用 extern 关键字,则可以通过以相同方式添加以下两个函数(即通过前向声明和实现权)来完全“让我们像 C 一样使用 C++”模式在int GetOUtsideCount()旁边:
Outside* CreateOutsidePointer(int count)
{
return new Outside(count);
}
void DestroyOutsidePointer(Outside* o)
{
return delete o;
}
我更愿意接受它。这很像APR使用的策略。