我遇到了一个旧代码,其中的项目很少,每个项目都没有抽象类,标头和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
答案 0 :(得分:0)
只要在ClassB定义之前预先声明了ClassA,对ClassA的引用的使用似乎是有效的。
答案 1 :(得分:0)
除了前向声明或显式包含之外,还可能存在另一个CPP文件,该文件以正确的顺序包含两个标头:
#include <ClassADef>
#include <ClassBDef>
这是一个不好的做法,但这可以解释您提供的代码的正确性。