0

相对较新的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;
4

2 回答 2

1

using directive并且using declaration仅对当前翻译单元有效。您可以将它们放在头文件中,这不是一个好习惯。

于 2013-09-27T17:43:47.270 回答
1

主要原因是编译器只查看一个.cpp文件加上它的任何内容#includes。它不知道基类using的文件中可能包含哪些语句。就此而言,当您为派生类编译文件时,.cpp甚至不知道您是否已经为基类编写了文件。并且它不会围绕文件系统进行查找,例如..cpp.cppjavac

此外,我猜您正在.cpp为每个类编写一个文件,并为该文件指定一个与类名有关的名称。但是 C++ 不需要这样。您可以在一个文件中拥有多个类,或者就此而言,您可以根据需要将一个类拆分为多个文件。

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

最后,一个原则性而非实用性的原因:基类的实现者可以方便地将某些命名空间中的名称带入全局范围,但这并不意味着派生类的实现者也会如此。派生类可能根本不使用ci::app,更不用说使用太多以至于编写派生类的人厌倦了键入它。因此,即使 C++可以要求编译器获取这些using语句(考虑到编译模型,它不能),我很确定语言的设计者不会想要它。

#include级联到子类

不,他们没有。中的任何内容#includebase.h将包含在derived.cppif(例如)derived.cpp包括derived.hwhich includesbase.h中。但是任何包含在base.cppderived.cpp.

这一切都假设您遵循通常的命名约定。没有什么比约定阻止你包含来自的.cpp文件了derived.cpp,在这种情况下(1)任何包含或using语句都将适用于derived.cpp,但不幸的是(2)你可能会破坏你的构建系统,因为很可能你将无法由于它们包含受单一定义规则约束的代码实体的重复定义,因此将它们联系base.o在一起。derived.o也就是函数。

于 2013-09-27T18:05:41.370 回答