我希望能够将类中的类似函数分组到一个组中,这样我就不需要将每个名称附加到它的内容中。
我见过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()
这样的继承方法?
答案 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);
}