命名空间Class替代中的函数?

时间:2017-03-16 00:24:59

标签: c++ class namespaces

我希望能够将类中的类似函数分组到一个组中,这样我就不需要将每个名称附加到它的内容中。

我见过this question表示你不能在类中拥有名称空间。我还看到this question建议使用强类型枚举。这里的问题是,我不确定这些枚举是否真的可以容纳功能?

问题背景化:

class Semaphore
{
public:

    void Set(bool State){Semaphore = State;}
    bool Get(){return Semaphore;}
    void Wait()
    {
        while (Semaphore)
        {
            //Wait until the node becomes available.
        }
        return;
    }
private:
    bool Semaphore      = 0;            //Don't operate on the same target simultaneously.
};

class Node : Semaphore
{
public:
    unsigned long IP    = 0;            //IP should be stored in network order.
    bool IsNeighbour    = 0;            //Single hop.

    std::vector<int> OpenPorts;
    //Rest of code...
};

目前,NodeClass.Get()是我获取信号量的方法。然而,这引起了Get()实际得到的混淆。我想要有类似于NodeClass.Semaphore::Get()的东西。否则,我必须拥有SemaphoreSet()SemaphoreGet()SemaphoreWait()这些功能,这些功能组织得不太好或看起来不太好。

我曾想过只拥有Semaphore类,并在其他类中实例化它,但如果我坚持使用继承方法,那就更好了。

基本上,是否可以访问InheritedClass.Group::Function()这样的继承方法?

1 个答案:

答案 0 :(得分:1)

如果你真的想这样做,你可以通过delete子类中的成员函数强制用户使用基类名调用:

class Base {
  public:
    void Set(bool) { }
};

class Derived : public Base {
  public:
    void Set(bool) = delete;
};

int main() {
    Derived d;
    // d.Set(true); // compiler error
    d.Base::Set(true);
}

但是,如果在子类上调用Set的语义与在基类上调用Set时所期望的语义明显不同,则应该使用数据成员并相应地命名成员函数,如您所述:

class Base {
  public:
    void Set(bool) { }
};

class Derived {
  public:
    void SetBase(bool b) {
        b_.Set(b);
    }
  private:
    Base b_;
};

int main() {
    Derived d;
    d.SetBase(true);
}