我有一个班级A
,以及两个班级B
和C
,继承自A
。
除了A
的方法之外,每个类都提供不同的内容,因此,我想将它们放在两个不同的文件中 - b.hpp
和c.hpp
,因为它们是具有内联函数的模板。
我还有一个班级User
,同时使用B
和C
个班级。在user.cpp
中,我应该接近:
# include "b.hpp"
# include "c.hpp"
class User{
...;
};
这会引发编译器重新定义错误,因为我在B
中保留了C
和bc.hpp
个类。
除了编程错误之外,这里的问题还很美观:我只是在小应用程序中使用ifdef / ifndef
指令找不到非常优雅 - 他们总是像IDE的解决方案一样对我说对于管理太多模块的人,以及那些甚至不了解指令的人。
是否有任何(甚至是非标准的,但至少是理智的)解决方法,或者我必须坚持在同一个文件中使用ifdef / ifndef
两个不同的类?
答案 0 :(得分:2)
如果你的意思是在头文件中,不,那就没有一个好的,可移植的方法来做到这一点。将所有头文件保留为格式是标准的 -
#ifndef MYHEADER_HPP
#define MYHEADER_HPP
// ... content
#endif
任何其他方式都是非标准的,而不是真正的 C ++。
答案 1 :(得分:2)
您始终可以使用#pragma once
。
答案 2 :(得分:1)
ifndef
确实是很好的做法。它们可以帮助您使文件标题自包含。
您不希望某个文件A
停止编译,因为您在另一个文件include
中的某处删除了C
语句B
。因此,您可以在C
和A
中加入B
。也许A
包含B
,但无所谓。否则,只要您从include C
移除B
,就必须在include C
中添加A
。
所以ifndef
确实是好的做法,应该使用。根据您的编译器,您可能有pragma once等语法快捷方式(查找讨论here) - 但请记住,即使大多数编译器都支持它也不标准。
顺便说一句,专业生产代码确实使用ifndef
警卫。