我正在寻找以下问题的解决方案:
我有一个X
课,其中(假设)只有protected
个成员。我有几个类A
,B
,C
,...
假设有一个类x
成员的现有实例X
(该实例可以是类X
的实例,或任何合适容器的实例的子集/ derived-class / ...取决于类X
):
s
相关的 S ,类的任何实例x
必须有权访问{ {1}} protected
成员。x
protected
成员的访问权限必须限制在x
(和s
)。x
的创建和销毁必须保持实例s
活着和不变。此外,在给定时间内,只存在一个x
[关系]与s
的实例。
换句话说,为了澄清上述要求:我需要任何实例x
都可以访问类s
的{{1}}成员,就像(例如)类的protected
一样set S 是公开派生自X
的,但继承中来自类X
的成员子集必须保持 alive 且不变是否创建或销毁实例X
。
此外,还必须满足以下要求:
s
必须被视为不可复制且不可移动。X
protected
X
成员包装的解决方案虽然可以接受,但是不可取。S
X
个朋友的所有类别显然是不可接受的(对许多班级来说)。当前实现的解决方案虽然不符合要求#5,但正在使用组合和父类来处理X
的 S 朋友的类,例如:
class X
{
// public: int get_prot(); // not allowed (rq#2)
protected: int prot;
friend class Xaxx;
// friend A; friend B; ... // not acceptable (rq#6)
};
class Xacc
{
protected:
Xacc(X& x) : x(x) {}
int& x_prot() { return x.prot; } // not desirable (rq#5)
X& x;
};
class A : public Xacc
{
public:
A(X& x) : Xacc(x) {}
void work() { x_prot() = 1; }
};
测试的另一个有趣的解决方案,满足了#4期望的所有要求:
class A : public X
{
public:
A(const X& x) : X(x) {} // X not copyable (rq#4)
void work() { prot = 1; }
};
任何直到C ++ 14的解决方案都是可以接受的。谢谢你的帮助。
原理:
澄清此问题的来源以及解决方案将以何种方式帮助我改进代码:
X
的实例),它实现了所有类型的工作(算法,i / o等等)。X
的实例。答案 0 :(得分:2)
让外部类成为它需要访问的类的朋友吗?
答案 1 :(得分:2)
如果 S 中的课程具有简单的统一界面(例如单一工作方法),您可以通过制作更改当前实施以满足要求#5 Xacc是一个模板类,通过将对X的受保护部分的访问实现移动到Xacc的特化中。它看起来像这样:
class X
{
protected:
int prot;
template<typename State> friend class Xacc;
};
template<class State>
class Xacc
{
public:
Xacc(X &x) : x(x) {}
void work();
private:
X &x;
};
class S1;
template<> void Xacc<S1>::work()
{
x.prot = 1;
};
class S1: public Xacc<S1>
{
public:
S1(X &x): Xacc<S1>(x) {}
protected:
};
答案 2 :(得分:1)
也许您可以使用passkey模式的某种变体
class XKey {
XKey(){}
friend class Xacc;
};
class X {
public:
int& get_prot(XKey) { return prot; } // Only accessible to those who can construct XKey
protected:
int prot;
};
class Xacc {
protected:
Xacc(X& x) : x(x) {}
X& x;
XKey getKey() { return XKey(); }
};
class A : public Xacc {
public:
A(X& x) : Xacc(x) {}
void work() { x.get_prot(getKey()) = 1; }
};
int main() {
X x;
A a(x);
a.work();
//x.get_prot(XKey()) = 2; // Error: XKey::XKey() is private
}
答案 3 :(得分:0)
我认为解决方案是:您必须为集合$scope.submit = function(usr, pw) {
if(!usr || !pw) {
alert('empty usr or pw');
return;
}
//your stuff, not mine
$scope.list = [];
var dataString = 'username='+ usr + '&password=' + pw;
$scope.text = '';
var payload = {
username: usr,
password: pw
};
$http.post('path/to/php/file', payload).then(function(response) {
//success
alert(response.data);
}).catch(function(response) {
//an error occurred
alert(response.data);
});
}
设置基类。
S
可以是您的班级S
,也可以是X
软件项目是需求和设计的平衡,当您列出所有6个需求时,解决方案仅限于您必须拥有具有共同功能的基类X
:访问您的Xacc
你知道“空中楼阁”的故事吗?如何在没有1楼的情况下只有2楼?