我不确定如何以最优雅的方式实现(在C ++中表达)以下问题。假设我们有一个库,为类PerfectCounter
提供了丰富的非虚拟接口。我想实现从DisturbedCounter
继承的类PerfectCounter
。新类应公开与其父类相同的接口,例如允许为两个类的实例对调用某些运算符(<
,>
,= =
等)。而且,我想禁止两个类之间的转换(两种方式)。
DisturbedCounter
可以从PerfectCounter
私有继承。它将阻止从DisturbedCounter
到PerfectCounter
的转换。但是,我必须在PerfectCounter
中将DisturbedCounter
API的99%明确声明为“ public”。这意味着将来需要进行大量的编写和维护。
有没有更好的方法来解决这个问题?
我可以使用C ++ 17。
答案 0 :(得分:0)
您可以让DisturbedCounter从PerfectCounter私下继承。然后将不允许它们之间进行转换(因为在这种情况下DisturbedCounter并不是PerfectCounter,因此仅根据一个实现)。
然后,您可以使用using
指令公开公开您想要在DisturbedCounter中公开提供的PerfectCounters接口的各个部分,并添加所需的任何比较运算符的实现。
当然还有其他解决方法,但这是您要考虑的至少一种方法。
答案 1 :(得分:0)
我不确定这是否正是您所需要的,因为DisturbedCounter不会从PerfectCounter继承。它使用CRTP来避免转换,它应该只允许您一次执行每个方法(真正不同的方法除外),并且您不需要基类的using
。我对模板不太满意,因此可能会被某人撕碎,但是,如果不是,它可能会给您一些想法,并且可能会有所建树。很多样板都丢失了。
#include <iostream>
template<class T>
struct Common {
protected:
double m_count;
public:
Common() : m_count(0) {}
Common& operator=(const Common& rhs) {
m_count = rhs.m_count;
return *this;
}
operator double () const { return m_count; }
double get() const { return m_count; }
};
// type specific implementation
struct PerfectCounter : Common<PerfectCounter> {
void count() {
m_count += 10.0;
}
};
// type specific implementation
struct DisturbedCounter : Common<DisturbedCounter> {
void count() {
m_count += 9.9;
}
};
int main() {
PerfectCounter a;
a.count();
DisturbedCounter b;
b.count();
//a = b; // error
//b = a; // error
if( a>b ) std::cout << "a>b\n";
std::cout << a << " " << b << "\n";
}
输出
a>b
10 9.9