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

问题描述 投票:0回答:2

相对较新的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;
c++ using subclassing
2个回答
1
投票

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


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都没有影响。

这是假设您遵循通常的命名约定。除了惯例之外,没有什么可以阻止你包括来自.cppderived.cpp文件,在这种情况下(1)任何包含或using语句将适用于derived.cpp,但不幸的是(2)你可能会破坏你的构建系统,因为很可能你赢了由于它们包含受一个定义规则约束的代码实体的重复定义,因此无法将base.oderived.o链接在一起。那就是功能。

© www.soinside.com 2019 - 2024. All rights reserved.