相对较新的cpp。当您将基类子类化时,#include 级联到子类,为什么 cpp 文件中的类范围使用也不涵盖子类的范围?这是历史原因还是实用原因?Err.. 是什么原因?
//available to subclass
#include <cinder/app/appBasic.h>
// have to duplicate in subclass
using namespace ci;
using namespace ci::app;
using namespace std;
相对较新的cpp。当您将基类子类化时,#include 级联到子类,为什么 cpp 文件中的类范围使用也不涵盖子类的范围?这是历史原因还是实用原因?Err.. 是什么原因?
//available to subclass
#include <cinder/app/appBasic.h>
// have to duplicate in subclass
using namespace ci;
using namespace ci::app;
using namespace std;
using directive
并且using declaration
仅对当前翻译单元有效。您可以将它们放在头文件中,这不是一个好习惯。
主要原因是编译器只查看一个.cpp
文件加上它的任何内容#includes
。它不知道基类using
的文件中可能包含哪些语句。就此而言,当您为派生类编译文件时,.cpp
甚至不知道您是否已经为基类编写了文件。并且它不会围绕文件系统进行查找,例如..cpp
.cpp
javac
此外,我猜您正在.cpp
为每个类编写一个文件,并为该文件指定一个与类名有关的名称。但是 C++ 不需要这样。您可以在一个文件中拥有多个类,或者就此而言,您可以根据需要将一个类拆分为多个文件。
因此,您知道该文件.cpp
是派生类的文件,而另一个文件是基类的文件,因此您认为如果将其他文件中的某些内容提升到该文件中可能会很方便。但是编译器不知道这样的事情。C++ 编译器谈论基类文件中的内容是没有意义的。.cpp
.cpp
.cpp
最后,一个原则性而非实用性的原因:基类的实现者可以方便地将某些命名空间中的名称带入全局范围,但这并不意味着派生类的实现者也会如此。派生类可能根本不使用ci::app
,更不用说使用太多以至于编写派生类的人厌倦了键入它。因此,即使 C++可以要求编译器获取这些using
语句(考虑到编译模型,它不能),我很确定语言的设计者不会想要它。
#include
级联到子类
不,他们没有。中的任何内容#include
都base.h
将包含在derived.cpp
if(例如)derived.cpp
包括derived.h
which includesbase.h
中。但是任何包含在base.cpp
对derived.cpp
.
这一切都假设您遵循通常的命名约定。没有什么比约定阻止你包含来自的.cpp
文件了derived.cpp
,在这种情况下(1)任何包含或using
语句都将适用于derived.cpp
,但不幸的是(2)你可能会破坏你的构建系统,因为很可能你将无法由于它们包含受单一定义规则约束的代码实体的重复定义,因此将它们联系base.o
在一起。derived.o
也就是函数。