我对C ++很陌生。今天,我遇到了混合嵌套类和接口的一些问题。
我写了一个小的(无用的)程序,在解释我的问题方面比长句更有效:
#include <iostream>
#include <vector>
class SomeInterface {
public:
virtual int SomeMethod() = 0;
class reference {
public:
virtual operator int() const = 0;
virtual reference& operator=(int x) = 0;
};
virtual reference operator[](unsigned int pos) = 0;
};
class A : public SomeInterface {
public:
A(unsigned int size) { vec_.resize(size, 0); }
int SomeMethod() { return 1; }
class reference : public SomeInterface::reference {
public:
reference(std::vector<int>::reference ref) : ref_(ref) { }
operator int() const { return (int) this->ref_; }
reference& operator=(int x) { this->ref_ = x; return *this; }
private:
std::vector<int>::reference ref_;
};
reference operator[](unsigned int pos) {
return reference(this->vec_[pos]);
};
private:
std::vector<int> vec_;
};
int main() {
A a(10);
a[5] = 42;
std::cerr << a[5] << std::endl;
return 0;
}
这里,如果删除界面中的行virtual reference operator[](unsigned int pos) = 0;
,程序编译正常。但是,我希望数组下标运算符成为接口的一部分。
G ++抛出的错误消息是invalid abstract return type for member function ‘virtual SomeInterface::reference SomeInterface::operator[](unsigned int)’
。
我明白为什么失败了。但我无法想出任何方法来制作类似这项工作的东西。任何人都可以解释为什么我在做(或思考)错了吗?
答案 0 :(得分:1)
你不能创建SomeInterface::reference
类型的对象,因为它是一个纯抽象类,这就是编译器告诉你的。
您需要将引用(或指针)返回给此类。像这样:
virtual reference& operator[](unsigned int pos) = 0;
然后:
virtual SomeInterface::reference& operator[](unsigned int pos)
btw注意如何创建此类的对象。他们没有虚拟析构函数。
答案 1 :(得分:1)
基本上你不能返回对永远不存在的东西的引用。但是,您可以使用指向抽象类的指针。该指针最终只能指向派生类的实例。
目前尚不清楚您正在尝试做什么。但是你可以研究一下Creation Patterns来找到你需要的东西