Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:使类及其某些数据成员仅在命名空间中可用_C++_Scope_Namespaces_Member - Fatal编程技术网

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