2015-07-13 133 views
1

我想让一个类包含到我的所有项目中,这样当我执行更改时,它将从该文件的副本中更新所有项目。C++在多个项目中包含一个类

例如:

foo.h中

class foo 
{ 
public: 
    foo(); 
}; 

extern Foo* pFoo; 

Foo.cpp中

Foo* pFoo; 


foo::foo() 
{ 
    printf("Foo\n"); 
} 

的main.cpp

#include "foo.h" 

int main(int argc, char* argv[]) 
{ 
    pFoo = new Foo(); 

    return 0; 
} 

我怎么能有 “foo.h中”干净利落地融入多个项目而没有任何麻烦?

+1

建立它到一个图书馆,链接图书馆。您也可以将其制作为一个项目并将其纳入您的解决方案中。项目和解决方案之间的区别在Visual Studio中很重要。 –

+1

我认为你的意思是“在许多项目中包含*对象*”。 – juanchopanza

+0

@RetiredNinja您可以列出将其作为项目纳入单独解决方案的详细信息吗?编辑:图书馆支持是否包含我目前的项目?我需要将我的项目(dll)与其他dll(两个文件)打包在一起吗? – John

回答

-1

单身呢?

class foo 
{ 
    foo() 
    { 
     printf("foo\n") ; 
    } 
public: 
    static foo &make(void) 
    { 
     static foo the_instance ; 
     return the_istance ; 
    } 
}; 

这样,你刚才一个实例(这是你想要的),你一定了解它的创建地方(这就是为什么constructore声明私有的)。

现在您已将整个cvlass放在一个单独的头文件中,您可以将其包含在项目中,而无需进一步的需求。

0

首先,你不能只将头文件包含在多个项目中;项目最终还必须与实施联系起来。

有很多方法可以做到这一点;这取决于你想如何工作以及你的工具是什么。

  1. 例如,如果你使用源代码控制(你应该是),一些源代码的控制系统将允许你共享项目之间的文件(SVN具有外部文件时,StarTeam已经共享文件.. ..)。如果你这样做了,每个项目在你签出时都会收到一份文件的副本,你可以将它作为项目的一部分正常构建。

  2. 另一种选择是制作图书馆。一旦你选择了这个选项,你必须做出另一种选择 - 静态库(.lib)或动态(.dll)。

两者都有优点和缺点。

2.a.静态链接看起来“更简单”,并在这里回答您的基本需求 - 只是将此类编译到您的项目中。但是,静态链接有局限性。如果使用不同于您要链接的项目的选项/设置来构建静态库,则可能无法工作。如果您对所有项目(或其中的某个子项)有一个策略来使用某些选项,那么这对您而言不会有任何问题。

要创建静态库,您需要创建一个静态库类型的visual studio项目。当它建立起来,而不是运行链接器,它会运行图书管理员。

2.b. DLL解决了大多数不同编译器选项的问题(有些东西可能会影响使用DLL等结构打包工作)。再次,您在Visual Studio中创建一个类型为DLL的项目,它将为您构建DLL。

然后,再次,你必须做出选择。将DLL链接到可执行文件时,必须选择动态链接或静态链接。要静态链接,您的项目中应包含一个.lib文件 - 它应该已经用您的DLL创建。如果你链接到这个.lib,那么程序会在它打开时查找并(尝试)加载DLL。

最灵活,最复杂的方法是动态链接。要做到这一点,在你的代码中你必须加载DLL并创建指向你想要使用的任何函数的指针。这可能是矫枉过正,可以解决您所描述的问题,并且我不确定您将如何访问类(而不是函数)。

无论使用DLL的任何一种方式,您都必须将它与您的程序一起分发,并确保它可以被程序访问(与可执行文件相同的文件,Windows DLL搜索路径中,或者在动态加载的情况下,您可以指定特定的路径,然后确保将DLL安装到该特定位置)。

如果你可以管理一个静态库(2.a),它就像你问的那样解决了这个问题,因为静态库基本上间接地包含了你的项目中的类 - 它是你的代码的编译版本用于链接。

即使你创建一个lib或一个DLL,你将不得不在你的源代码控制中解决你如何将它包含在你的不同项目中。

+0

好吧,我现在才意识到这是一个老问题......我假设原来的海报现在已经解决了他的问题:-)好吧,也许它会帮助别人! – Basya

相关问题