对于容器类,我想提供一个具有多个分组类别的函数的接口,例如:
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"
显然代码本身是假的,我已经使用范围运算符::
作为其他东西的潜在占位符(我知道你不能在类中创建命名空间)。
以下代码段演示了实现此类目标的方法:
#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
)的一个实例。有没有办法以不同的方式实现此功能(可能使用实际范围运算符::
来指示要调用的成员驻留在内部范围内)?
答案 0 :(得分:0)
我真的不明白你想要实现这种行为的原因。但是,如果你想实现类似的东西,你可能会受到以下启发(虽然我不会在任何项目中使用这样的代码,仍然没有看到一个合理的原因):
#include <iostream>
class Interface1
{
protected:
virtual ~Interface1() {}
virtual void DoStuff1() = 0;
};
class Interface2
{
protected:
virtual ~Interface2() {}
virtual void DoStuff2() = 0;
};
class Interface3
{
protected:
virtual ~Interface3() {}
virtual void DoStuff3() = 0;
};
class Container;
class Grouper1
{
public:
static void DoStuff1(Container& arContainer);
static void DoStuff2(Container& arContainer);
};
class Grouper2
{
public:
static void DoStuff3(Container& arContainer);
};
class Container : public Interface1, public Interface2, public Interface3
{
public:
virtual ~Container() {}
private:
friend class Grouper1;
friend class Grouper2;
virtual void DoStuff1() { printf("DoStuff1()\n"); }
virtual void DoStuff2() { printf("DoStuff2()\n"); }
virtual void DoStuff3() { printf("DoStuff3()\n"); }
};
void Grouper1::DoStuff1(Container& arContainer) { arContainer.DoStuff1(); }
void Grouper1::DoStuff2(Container& arContainer) { arContainer.DoStuff2(); }
void Grouper2::DoStuff3(Container& arContainer) { arContainer.DoStuff3(); }
int main(int aArgc, char** aArgv)
{
Container c;
Grouper1::DoStuff1(c);
Grouper1::DoStuff2(c);
Grouper2::DoStuff3(c);
return 0;
}
这样你的Container可以实现一些接口,你的Groupers提供静态函数(分组)来访问这些方法(尽管你需要传递实际的容器,你想要处理)。但是如果你不提供一些辅助函数/类(如Grouper1,Grouper2),你绝对不会实现类似命名空间的访问。