我正在做一个大学编程项目,缩短细节我做了一个游戏开发框架,我想要很容易出错(充足的静态和类型安全)
我发现自己有一个问题,我虽然需要律师 - 客户成语,其中只有一个Actor可以创建一个组件,但我有一些不舒服和可以用来跳过派生组件类和其他用途的律师(主要限制创建,但也有一些对象管理和事件处理)
我的解决方案最终是为我想要允许的每个动作设置一个类似于律师 - 客户的类,一个权限单,允许更多地说明为什么滑动通过以及为什么需要避免误用。
它允许有限次数的使用(在我的特定情况下仅使用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 };
};
使用示例
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() {}
};
我想我问的问题是,我是否已经错过了律师 - 客户成语的一些重要特征,或者错过了这个系统的重要缺陷,相关的是,如果有一种更惯用的方法来解决这个问题
编辑:忘记了createB使用示例中的constructer 进一步编辑:m_uses的值在传递时没用,修改为仅作为参考传递。还有一些小的语法错误 甚至进一步编辑:将getUses函数附加到权限单