访问其他抽象类而不在c ++中包含引用

时间:2019-05-16 02:53:44

标签: c++ namespaces

我遇到了一个旧代码,其中的项目很少,每个项目都没有抽象类,标头和cpp文件。 奇怪的是,在一个项目中,抽象类利用了在同一项目中另一个抽象类中声明的函数。令我惊讶的是,当前抽象类中没有引用另一个抽象类,并且编译器未引发任何错误。 我唯一注意到的是两个文件都在名称空间中。

任何人都可以解释这怎么可能吗?

这是被引用的类的示例代码

#ifndef ClassADef
#define ClassADef

#include <string>

namespace globalNameSpace {
class ClassA {
public:

    virtual ~ClassA() = default;
    virtual std::string method1() const = 0;
};
}
#endif

这是引用上述类的类的示例代码。

#ifndef ClassBDef
#define ClassBDef

#include <string>

//I was expecting an include statement which references the above class

namespace globalNameSpace {
class ClassB {
public:
    virtual std::string method2(const ClassA& method1, const bool variable) = 0; 
//I was expecting the compiler to throw an error.
};

}

#endif

2 个答案:

答案 0 :(得分:0)

只要在ClassB定义之前预先声明了ClassA,对ClassA的引用的使用似乎是有效的。

答案 1 :(得分:0)

除了前向声明或显式包含之外,还可能存在另一个CPP文件,该文件以正确的顺序包含两个标头:

#include <ClassADef>
#include <ClassBDef>

这是一个不好的做法,但这可以解释您提供的代码的正确性。