C++ C++;:使类及其某些数据成员仅在命名空间中可用
是否可以使类仅在命名空间内可用?或者有没有其他方法,不使用名称空间? 我正在创建一个框架,不希望这个框架的用户能够访问所有类,只访问特定的类 但是:用户无论如何都应该能够访问所有定义,以便创建指向这些类的指针变量。此外,他不应该能够访问这些类的所有数据成员,但我希望我的框架能够访问所有数据成员 这可能吗 示例(作为对我请求的解释):C++ C++;:使类及其某些数据成员仅在命名空间中可用,c++,scope,namespaces,member,C++,Scope,Namespaces,Member,是否可以使类仅在命名空间内可用?或者有没有其他方法,不使用名称空间? 我正在创建一个框架,不希望这个框架的用户能够访问所有类,只访问特定的类 但是:用户无论如何都应该能够访问所有定义,以便创建指向这些类的指针变量。此外,他不应该能够访问这些类的所有数据成员,但我希望我的框架能够访问所有数据成员 这可能吗 示例(作为对我请求的解释): /* T2DApp.h */ namespace T2D { // I don't want the user to be able to create a
/* T2DApp.h */
namespace T2D {
// I don't want the user to be able to create an instance of this class (only pointer vars), but the framework should be able to.
class T2DApp {
public:
// constructor, destructor... //
SDL_Window* Window;
SDL_Surface* Surface;
bool Running = false;
}
}
/* T2D.h */
#include "T2DApp.h"
void init();
/* T2D.cpp */
#include "T2D.h"
void init() {
T2D::T2DApp app; // function in framework is able to create new instance of T2DApp.
app.Window.Whatever(); // every data member should be available to framework directly without getter methods.
app.Window.Whatever(); // dito
app.Running = true; // dito
}
/* [cpp of user] */
#include "T2D.h"
void main(etc.) {
...
T2D::T2DApp app; // User shouldn't be able to create an instance of T2DApp
T2D::T2DApp* p_app; // but he should still be able to "see" the class definition for creating pointers
...
p_app.Running = true; // User shouldn't be able to access this data member
p_app.Window.Whatever(); // But he should be able to access the other data members
p_app.Surface.Whatever(); // dito
...
}
非常感谢您:)您可以:
“实现指针”或“pIMPL”是C++编程技术,通过将类的实现细节放在单独的类中,通过不透明指针访问类的实现细节。
在
T2DApp
周围有名称空间细节
或名称空间内部
,文档中说“名称空间内的任何内容细节
/内部
都不能被用户手动触摸”是很常见的。啊,我记得我曾经读过一次关于这项技术的文章;但是,我们不建议使用这种习惯用法,这是真的吗?@Tobbeidner这种技术在构造和通过指针间接寻址的过程中需要额外的内存分配。这两个问题都可以通过使用std::aligned_storage
而不是指针来消除,但是,在这种情况下,实现类的大小必须在头中公开。例如,仅仅编写一个包装类是否更干净,我在其中定义了额外的方法和数据成员,这些方法和数据成员只引用用户需要访问的类T2DApp
的那些成员?或者这是一个相对较大的资源杀手?@Tobbyidner如果我理解正确的话,包装器类中的每个引用都将采用指针的大小。这是正确的。我知道它也不是很“干净”。我想我无论如何都得试试pimpl xD