2014-05-20 61 views
0

宣布在不同的文件中使用的对象我有一个具有多个文件一个C++项目。在跨越整个项目

文件啊

#ifndef A_H 
#define A_H 
    class A 
    { 
     void somefunctionA(); 
    }; 
    A a; 
#endif 

文件了Bh

#ifndef B_H 
#define B_H 
    class B 
    { 
     void somefunctionB(); 
    }; 
    B b; 
#endif 

我想使用对象aB类和对象的bA类 所以基本上我想用变量ab任何地方该程序。

的main.cpp

#include "A.h" 
#include "B.h" 
... 

但有冲突。对象“A”是不是在B类 什么能在这种情况下进行,并有更好的办法看到的?

+0

不要在头文件中定义*变量。想想如果将头文件包含在多个源文件中会发生什么情况。 –

+0

也许这是我的问题。我应该在哪里定义它们?我希望他们成为超级全球。 – user3485986

+0

一个面向对象的解决方案将是Singleton模式 – jasal

回答

2

你可以声明任何地方的类,就像在一个不相关的头文件中一样。

例如:

#ifndef B_H 
#define B_H 

// Declaration of class A 
class A; 

extern A a; 

class B 
{ 
    void somefunctionB(); 
}; 

extern B b; 

#endif 

现在在例如实施B::somefunctionB您可以使用变量a没有看到变量的定义。尽管如此,你确实需要定义A类。


一个声明基本上你告诉的东西存在的编译器,它是什么类型,它有什么样的名字。这就像函数原型,你在声明某处有一个函数的定义,但是在函数原型声明之后,你可以调用函数而不必看到函数定义(实现)。另一方面,告诉编译器(以及稍后的链接器)“这就是它”的含义。

A 定义。变量的定义不仅告诉编译器该变量存在,还指示编译器为结果可执行程序中的变量保留空间。函数的定义是函数的实际实现,其中函数中包含代码。顺便说一下,如果一个变量或函数没有被声明,那么编译器就会看到变量或函数的定义,那么定义也是声明。


如果,你的状态,你有类内嵌在类定义的所有代码,你将不得不使用全局变量,只有一个类声明一个问题,你需要完整的类定义。但是,如果在类别B中使用类A,反之亦然,您将有一个难以中断的循环依赖关系:类A需要类B才能正常工作,但类B需要类A才能正常工作。

打破这种循环依赖的最简单的解决方案是把从A类使用B类在一个单独的源文件中的代码,并且相同的用于B类使用A类的代码。通过这种方式,头文件不需要包含相互之间的循环依赖关系,并且源文件可以同时包含两个头文件而不会出现问题。

+0

什么是extern A a; ? – user3485986

+0

@ user3485986这是*声明*。我已经用什么声明更新了我的答案。 –

+0

因此,而不是A;我应该写一个extern A a;在A.h? – user3485986

1

使用Singleton模式实现应该只有一个单一的全球实例类:

class A 
{ 
public: 
    static A& instance() 
    { 
    static A instance_; 
    return instance_; 
    } 

    virtual ~A() {} 

private: 
    A() {}     // prevent direct instantiation 

    A(const A&);    // prevent copy construction 
    A& operator=(const A&); // prevent assignment 
}; 

然后使用A::instance()无论你需要与对象实例交互。

当然这个模式应该谨慎使用。确保在创建一个对象之前确实需要一个全局对象,并且没有其他方法可以为您提供相同的功能。

请注意,此模式为不适用于互相依赖的全局对象,因为静态初始化的顺序未定义。