如何使用extern而不是#include在源文件中使用头文件中的类?

Joa*_*nge -9 c++ extern

如果我有一个班级outside.h:

class Outside
{
   public:
       Outside(int count);
       GetCount();
}
Run Code Online (Sandbox Code Playgroud)

如何使用extern关键字在framework.cpp中使用它,我需要实例化类并调用GetCount


编辑:

#include 不被允许.

Dan*_*nra 6

这里的每个人都有点太温柔.绝对没有理由为什么你不想包含.h文件.

去吧,包括文件!


Max*_*ert 5

只是为了澄清.这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使用的策略.