gpt4 book ai didi

c++ - 覆盖纯虚拟运营商

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:16:04 26 4
gpt4 key购买 nike

我正在尝试创建一个强制所有派生类实现此接口(interface)的计数器接口(interface):

class CounterInterface 
{
public:
virtual CounterInterface& operator ++ () = 0;
virtual CounterInterface operator ++ (int) = 0;
virtual CounterInterface& operator -- () = 0;
virtual CounterInterface operator -- (int) = 0;
virtual bool operator == ( const CounterInterface o ) const = 0;
virtual operator uint32_t () const = 0;
virtual void reset() = 0;
};

但是,仅包含此类定义会导致以下错误。

很遗憾,post inc 无法定义为引用。

关于如何解决先有鸡还是先有蛋的问题有什么想法吗?

CounterInterface.h:25:29: error: invalid abstract return type for member function ‘virtual libceis::CounterInterface libceis::CounterInterface::operator++()’
CounterInterface.h:22:8: note: because the following virtual functions are pure within ‘libceis::CounterInterface’:
CounterInterface.h:25:29: note: virtual libceis::CounterInterface libceis::CounterInterface::operator++()
CounterInterface.h:26:29: note: virtual libceis::CounterInterface libceis::CounterInterface::operator++(int)
CounterInterface.h:27:29: note: virtual libceis::CounterInterface libceis::CounterInterface::operator--()
CounterInterface.h:28:29: note: virtual libceis::CounterInterface libceis::CounterInterface::operator--(int)
CounterInterface.h:29:17: note: virtual bool libceis::CounterInterface::operator==(libceis::CounterInterface) const
CounterInterface.h:30:12: note: virtual libceis::CounterInterface::operator uint32_t() const
CounterInterface.h:31:17: note: virtual void libceis::CounterInterface::reset()
CounterInterface.h:26:29: error: invalid abstract return type for member function ‘virtual libceis::CounterInterface libceis::CounterInterface::operator++(int)’

最佳答案

你运气不好。您想要返回一个具有调用函数的对象的动态类型 的值。您不能:C++ 中的(非指针)值不能是协变返回类型,因为 C++ 中的按值返回不能具有与其静态类型不同的动态类型。

这与实现虚拟 clone() 的问题基本相同.它不能按值返回。即使CounterInterface你也会有麻烦的不是抽象类,但是当代码编译失败时您不会注意到它,而是在返回的对象被切片时注意到它。

您可以做的是扩展设计。编写一个类,其中包含指向 CounterInterface 实例的(智能)指针.这种类型可以按值返回,因此可以实现您想要的接口(interface)。它可以通过调用纯虚函数来做到这一点 CounterInterface *clone() (或 unique_ptr<CounterInterface> clone() )分配并返回实现接口(interface)的具体类的新实例。对于作为虚函数工作的运算符,您可以将它们保留在 CounterInterface 上。并且您的包装类可以调用,或者您可以在虚拟接口(interface)中重命名它们:

class Counter {
unique_ptr<CounterInterface> ctr;
public:
Counter(unique_ptr<CounterInterface> c) : ctr(std::move(c)) {}
Counter(CounterInterface *c) : ctr(c) {}
Counter &operator++() {
ctr->increment(); // or ++(*ctr)
return *this;
}
Counter operator++(int) {
Counter ret(ctr->clone());
ctr->increment();
return ret;
}
operator uint32_t() const {
return *ctr;
}
void reset() {
return ctr->reset();
}
};

虚拟 operator==是一个完全独立的问题,我将留给网站上的其他问题。

顺便说一句,CounterInterface需要一个虚拟析构函数。

关于c++ - 覆盖纯虚拟运营商,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13878448/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com