为什么子类'使用语句必须重复?

时间:2013-09-27 17:38:20

标签: c++ using subclassing

对cpp相对较新。当你将基类子类化为#include级联到子类时,为什么cpp文件中的类范围使用也不包括子类的范围?这是历史或实际的原因吗?呃..这是什么原因?

//available to subclass
#include <cinder/app/appBasic.h>

// have to duplicate in subclass
using namespace ci;
using namespace ci::app;
using namespace std;

2 个答案:

答案 0 :(得分:1)

using directiveusing declaration仅对当前翻译单元有效。你可以将这些放在头文件中,这不是一个好习惯。

答案 1 :(得分:1)

主要原因是编译器只查看一个.cpp文件加上#includes。它不知道基类的using文件中可能有哪些.cpp语句。就此而言,当您为派生类编译.cpp文件时,它甚至不知道您是否为基类编写了.cpp文件。而且,与javac不同,它不会围绕文件系统找到答案。

此外,我猜你正在为每个类编写一个.cpp文件,并为该文件提供一个与类名有关的名称。但是C ++并不需要这样。您可以在文件中包含多个类,或者如果您愿意,可以在多个文件中拆分类。

因此,您知道此.cpp文件是派生类的 文件,而另一个.cpp文件是 文件对于基类,因此您认为将其他.cpp文件中的某些内容提升到此.cpp文件中可能会很方便。但编译器不知道这样的事情。对于C ++编译器来说,讨论基类的 文件中的内容是没有意义的。

最后,一个原则而非实用的原因:仅仅因为基类的实现者将某些名称空间中的名称带入全局范围是方便的,并不意味着实现者的情况也是如此。派生类。派生类可能根本不使用ci::app,更不用说使用它了以至于编写派生类的人厌恶输入它。所以即使C ++ 可以要求编译器获取那些using语句(鉴于编译模型,它不能),我很确定该语言的设计者不会想要它来。

  

#include级联到子类

不,他们没有。 #include中的任何base.h都会包含在derived.cpp中,如果(例如)derived.cpp包含derived.h,其中包含base.h。但base.cpp中的任何包含对derived.cpp都没有影响。

这是假设您遵循通常的命名约定。除了惯例之外,还有其他任何内容可以阻止.cpp来自derived.cpp的{​​{1}}文件,在这种情况下(1)任何包含或using语句将适用于derived.cpp,但不幸的是( 2)你可能会破坏你的构建系统,因为很可能你不能再将base.oderived.o联系在一起,因为它们包含重复定义的代码实体的定义定义规则。那就是功能。