С++ Лучший способ иметь член класса, который является указателем (или ссылкой) на другой класс и может обрабатывать как константные, так и неконстантные ситуации.

Рассмотрим следующий пример кода. Он компилируется и работает так, как ожидалось. Однако, если я добавлю «const» в начало первой строки основной функции, она не скомпилируется, потому что класс B принимает указатель на A , а с добавлением const вместо этого у нас будет указатель на const A. Шаблон B - это вариант, но мне интересно, есть ли для этого более чистые/красивые решения. Я открыт для различных предложений, включая перемещение B внутрь A, если это поможет (B используется только A).

      #include <vector>

template <typename T>
class B;

template <typename T>
class A{
  friend class B<T>;

  std::vector<T> data;

public:
  A(int n) {
    data.resize(n); for (int i = 0; i < n; i++)
      data[i] = static_cast<T>(i);
  }
  B<T> getB(int pos) {return B<T>(this, pos);}
  const B<T> getB(int pos) const {return B<T>(this, pos);}
};

template <typename T>
class B {
    A<T>* pointerToA;
    int pos;
  public:
    B(A<T>* pointerToA_, int pos_) : pointerToA(pointerToA_), pos(pos_) {}
    T& get() const { return pointerToA->data[pos]; }
    T& get() { return pointerToA->data[pos]; }
  };

int main() {
  A<int> a(10); // const A<int> a(10); will not compile!
  int& i = a.getB(3).get();
}

0 ответов

Другие вопросы по тегам