С++ Лучший способ иметь член класса, который является указателем (или ссылкой) на другой класс и может обрабатывать как константные, так и неконстантные ситуации.
Рассмотрим следующий пример кода. Он компилируется и работает так, как ожидалось. Однако, если я добавлю «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();
}