考虑以下示例代码。它按预期编译和工作。但是,如果我在 main 函数的第一行的开头添加“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();
}