0

对于容器类,我想提供一个包含多个功能的接口,这些功能分为几类,例如:

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

4

1 回答 1

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 提供静态函数(分组)来访问这些方法(尽管您需要传递实际的 Container,但您想要处理)。但是如果你不提供一些辅助函数/类(如 Grouper1、Grouper2),你肯定不会实现类似命名空间的访问。

于 2013-08-27T12:54:13.880 回答