【发布时间】:2013-08-27 12:27:42
【问题描述】:
对于一个容器类,我想提供一个接口,其中包含几个分组分类的函数,例如:
Data::Get::FirstGetter()
Data::Get::SecondGetter()
Data::Set::FirstSetter()
Data::Set::FirstSetter()
这将允许这样的事情:
Data myData;
myData::Set::FirstSetter( stuff );
std::cout << myData::Get::FirstGetter() << std::endl; // -> "stuff"
显然代码本身是伪造的,我使用范围运算符:: 作为其他东西的潜在占位符(我知道您不能在类中创建命名空间)。
在下面的 sn-p 中演示了一种实现类似功能的方法:
#include <iostream>
struct Foo {
private:
struct aBar {
void IFunc(){
std::cout << "IFunc()" << std::endl;
}
};
public:
void OFunc(){
std::cout << "OFunc()" << std::endl;
}
aBar Bar;
};
int main(){
Foo foo;
foo.OFunc();
foo.Bar.IFunc();
}
但是,为了使用它,必须为每个分组对象创建一个实例(在伪代码示例中,Get 的一个实例和Set 的另一个实例,在虚拟示例中aBar 的一个实例)。有没有办法以不同的方式实现此功能(可能使用实际的范围运算符:: 来指示要调用的成员位于内部范围内)?
【问题讨论】:
-
这是可能的,但是你为什么要这样做而不是仅仅使用直接的方法呢?
-
静态函数/成员
-
听起来你是想绕过“普通”会员?或者,与
Data.m_get.firstGetter()/Data.m_get.secondGetter()(其中m_get是某个成员类)相比,您要实现的实际用例是什么? -
是的,当然,可以使用
Get/Set成员类来做同样的事情(如上所示)。我只是想问是否有另一种方法可以实现这一点,它确实可以绕过创建Get/Set内部类的实例。 -
我认为你应该重新考虑你的设计。没有优雅的方法可以实现您想要的。
标签: c++ class namespaces