如果我有一个班级outside.h:
class Outside
{
public:
Outside(int count);
GetCount();
}
Run Code Online (Sandbox Code Playgroud)
如何使用extern关键字在framework.cpp中使用它,我需要实例化类并调用GetCount?
#include 不被允许.
只是为了澄清.这extern课不可能:
class Outside
{
public:
Outside(int count);
GetCount();
}
Run Code Online (Sandbox Code Playgroud)
但是,一旦你有framework.cpp可用的类,你CAN extern类型的对象Outside.你需要一个声明该变量的.cpp文件:
#include "outside.h"
Outside outside(5);
Run Code Online (Sandbox Code Playgroud)
然后你可以通过另一个文件引用该对象extern(只要在编译项目时链接到正确的目标文件中):
#include "outside.h"
extern Outside outside;
int current_count = outside.GetCount();
Run Code Online (Sandbox Code Playgroud)
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);
}
Run Code Online (Sandbox Code Playgroud)
在.cpp文件中实现该功能.当你在它的时候,你也可以创建你想要的全局变量extern(注意,变量本身不需要是一个指针):
#include "outside.h"
namespace X {
int GetOutsideCount(Outside* o)
{
return o->GetCount();
}
}
X::Outside outside(5);
Run Code Online (Sandbox Code Playgroud)
然后在你的程序中执行此操作(请注意,您不能调用任何方法,outside因为您没有包含outside.h,并且您不希望通过添加类的新定义或那些方法来违反一个定义规则;但是因为定义不可用,你需要将指针传递给outside周围而不是outside自己):
namespace X {
class Outside;
int GetOutsideCount(Outside* o);
}
extern X::Outside outside;
int main()
{
int current_count = GetOutsideCount(&outside);
}
Run Code Online (Sandbox Code Playgroud)
我认为这是令人憎恶的,温和地说.你的程序将找到该GetOutsideCount函数,通过传递它来调用它Outside*. Outside::GetCount实际上编译为一个普通函数,它接受一个秘密Outside对象(在Outside::GetCount该对象内部通过this指针引用),因此GetOutsideCount将找到该函数,并告诉它取消引用Outside*传递给它的函数GetOutsideCount.我认为这被称为"走很远的路".
但是它就是这样啊.
如果你没有结婚使用extern关键字,你可以通过以相同的方式添加以下两个函数来完全"让我们使用C++就像它的C"模式一样(即通过前向声明并在下面执行int GetOUtsideCount():
Outside* CreateOutsidePointer(int count)
{
return new Outside(count);
}
void DestroyOutsidePointer(Outside* o)
{
return delete o;
}
Run Code Online (Sandbox Code Playgroud)
我更愿意吞下那个.这很像APR使用的策略.
| 归档时间: |
|
| 查看次数: |
1759 次 |
| 最近记录: |