Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.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/3/templates/2.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/.net/20.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++_Templates_Encapsulation_Type Safety - Fatal编程技术网

C++ c++;许可证成语?

C++ c++;许可证成语?,c++,templates,encapsulation,type-safety,C++,Templates,Encapsulation,Type Safety,我正在做一个大学编程项目,简化细节,我正在制作一个游戏开发框架,我希望很难出错(大量的静态和类型安全性) 我发现自己遇到了一个问题,虽然我需要律师客户机习惯用法,其中只有参与者才能创建组件,但我有一些不舒服的、愚蠢的圈套,可以使用派生的组件类和律师的其他用途(主要限制创建,但也有一些对象管理和事件处理) 最后,我的解决方案是为我想允许的每一个行为都设置一个类似于律师-客户的类,一个许可证,允许更具体地说明为什么要通过许可证以及为什么需要它来避免滥用 它允许有限数量的使用(在我的特殊情况下只有1次

我正在做一个大学编程项目,简化细节,我正在制作一个游戏开发框架,我希望很难出错(大量的静态和类型安全性)

我发现自己遇到了一个问题,虽然我需要律师客户机习惯用法,其中只有参与者才能创建组件,但我有一些不舒服的、愚蠢的圈套,可以使用派生的组件类和律师的其他用途(主要限制创建,但也有一些对象管理和事件处理)

最后,我的解决方案是为我想允许的每一个行为都设置一个类似于律师-客户的类,一个许可证,允许更具体地说明为什么要通过许可证以及为什么需要它来避免滥用

它允许有限数量的使用(在我的特殊情况下只有1次使用),这是为了确保传递给组件的许可证不能用于创建其他组件和其他类似问题

实施实例

template<typename T, typename T_Permit>
class PermissionSlip {
public:

    PermissionSlip(const PermissionSlip& t_other) = delete;
    ~PermissionSlip() {
    }

    // use permission slip
    void use() {
        assert(m_uses != 0 && "No more uses permitted.");
        --m_uses;
    }

    unsigned int getUses() { return m_uses; }
private:

    // allow T to create permission slip
    friend typename T;
    PermissionSlip() : m_uses{ 1 } {}
    PermissionSlip(unsigned int t_uses) : m_uses{ t_uses }
    unsigned int m_uses{ 1 };
};
模板
类别许可证{
公众:
许可证单(施工许可证单和其他)=删除;
~PermissionSlip(){
}
//使用许可证
无效使用(){
断言(m_使用!=0&“不允许再使用”);
--m_使用;
}
unsigned int getUses(){return m_uses;}
私人:
//允许T创建权限条
朋友类型名T;
PermissionSlip():m_使用{1}{}
PermissionSlip(unsigned int t_uses):m_uses{t_uses}
无符号整数m_使用{1};
};
使用示例

class B;

class P_ConstructB;
typedef PermissionSlip<A, P_ConstructB> ConstructBPermit;

class A {
public:

    A() {}
    ~A() {}

    template<typename T>
    void createB() {
        ConstructBPermit permit;
        B* myB = new T( permit );
        m_myBs.push_back(myB);
    }
private:

    std::vector<B*> m_myBs;
};

class B {
public:

    B(ConstructBPermit& t_permit) { t_permit.use(); }
    ~B() {}
};


class C : B {
public:

    C(ConstructBPermit& t_permit) : B{ t_permit } {}
    ~C() {}
};
B类;
b类;
typedef许可证;
甲级{
公众:
A(){}
~A(){}
模板
void createB(){
建造许可证;
B*myB=新T(许可证);
m_myB.向后推(myB);
}
私人:
std::向量m_myBs;
};
B类{
公众:
B(构造许可证和t_许可证){t_许可证.use();}
~B(){}
};
丙类:乙类{
公众:
C(建造许可证):B{t{U许可证}
~C(){}
};
我想我要问的问题是,我是否遗漏了律师-客户习惯用语的一些重要特征,或者遗漏了这个系统的一些重要缺陷,这与是否有更惯用的方法来处理这个问题有关

编辑:在createB使用示例中忘记构造函数 进一步编辑:m_使用的值在传递时无效,修改为仅作为参考传递。还有一些小的语法错误
更进一步的编辑:将getUses函数附加到权限条

老实说,这个
PermissionSlip
类似乎完全没有用处。如果您想限制可以创建的类实例的数量(我想这就是您实际要做的)然后,最好从一些检查默认构造函数中创建的实例数的
InstanceCounter
派生出B。现在您提到我刚刚意识到,可以传递和使用权限条,而不需要记住已传递的条,我现在将其作为参考传递来解决这个问题。实际意图是slip只能使用一次,所以当A给C构造B的许可时,它只能将其传递给B,它不能传递给另一个实例来创建另一个组件。哦,我在评论中没有提到这一点,但最初的想法是我只希望一个演员能够构造任何类型的组件,允许外部组件派生类,避免使用friend,这样其他贡献者就不会像对待actor那样对待它,因为它会弄乱组件的内部。我以前见过并使用过权限或访问标记的概念,但我不确定使用计数的增加。现在还不清楚你想用它来防止什么样的问题,但我注意到,任何给定的类或函数要么可以创建零权限,要么可以创建任意数量的权限。在我目前的使用中,bool也可以,为了灵活性,我只是想使用数字类型。例如,objectA希望触发事件,事件围绕管理器及其资源展开,objectA为了从管理器触发事件请求许可证,然后确定适合其资源的事件触发次数。当然,您需要一个getUses函数,以便在不捕获异常的情况下使其有用