类中类似命名空间的访问

时间:2013-08-27 12:27:43

标签: c++ class namespaces

对于容器类,我想提供一个具有多个分组类别的函数的接口,例如:

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)的一个实例。有没有办法以不同的方式实现此功能(可能使用实际范围运算符::来指示要调用的成员驻留在内部范围内)?

1 个答案:

答案 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),你绝对不会实现类似命名空间的访问。