在C ++中混合接口和嵌套类

时间:2013-10-15 21:01:11

标签: c++ interface nested-class

我对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)’

我明白为什么失败了。但我无法想出任何方法来制作类似这项工作的东西。任何人都可以解释为什么我在做(或思考)错了吗?

2 个答案:

答案 0 :(得分:1)

你不能创建SomeInterface::reference类型的对象,因为它是一个纯抽象类,这就是编译器告诉你的。

您需要将引用(或指针)返回给此类。像这样:

virtual reference& operator[](unsigned int pos) = 0;

然后:

  1. 在派生类中,您不应更改纯虚方法的签名。它应该保持virtual SomeInterface::reference& operator[](unsigned int pos)
  2. 您无法返回对临时对象的引用

  3. btw注意如何创建此类的对象。他们没有虚拟析构函数。

答案 1 :(得分:1)

基本上你不能返回对永远不存在的东西的引用。但是,您可以使用指向抽象类的指针。该指针最终只能指向派生类的实例。

目前尚不清楚您正在尝试做什么。但是你可以研究一下Creation Patterns来找到你需要的东西