从模板化的类赋值操作符访问私有成员变量
Accessing private member variables from a templated class assignment operator
我有一个模板化的容器类。我重载了赋值操作符,使得派生类型也可以赋值。
我的问题是,当类型不相同时,我无法访问容器类的私有成员。获得访问权限的最佳途径是什么?成员变量不能通过公共getter来访问。谢谢!
示例代码:
// Note: var is private
template <class T>
Container<T>& Container<T>::operator=(const Container<T>& rhs) {
if(*this != rhs) var = rhs.var; // works for same type
return *this;
}
template <class T>
template <typename U>
Container<T>& Container<T>::operator=(const Container<U>& rhs) {
if(*this != rhs) var = rhs.var; // does NOT work for different types
return *this;
}
由于您想要访问用不同类型实例化的模板类的私有成员,因此您必须使其他模板作为模板类的朋友,如:
template <class T>
class Container
{
template<class U>
friend class Container;
};
注意,如果T
和U
是不同的类型,那么Container<T>
和Container<U>
是两个完全不同的类别;如果你不和别人交朋友,你就不能访问别人的私有成员。
char
, int
, short
实例化它,则
-
Container<int>
将是Container<char>
和Container<short>
的朋友。 -
Container<char>
将成为Container<int>
和Container<short>
的朋友。 -
Container<short>
将成为Container<int>
和Container<char>
的朋友。
这里有趣的短语是:"彼此的朋友"。通常这种情况不会发生。例如,如果您有这样一个类:
class A
{
friend class B;
};
那么这里只有B
是A
的朋友。A
不是B
的朋友。他们不是"彼此的朋友"。B
可以访问A
的私有成员,而A
不能访问B
的私有成员。
第一个操作符可以工作,因为访问是类作用域而不是对象作用域。这意味着你可以跨同一个类的实例访问私有成员。
要访问不同类的私有成员而不使用getter或setter,你需要使你的类与另一个类成为朋友。
其他方法涉及hack,直接访问内存并且不可移植
相关文章:
- C++ 传递指向对象的指针的指针,无法访问成员
- 从不同C++类的成员变量访问成员函数
- 使用 getter 访问成员变量C++
- 如何使用包含内部类的类实例有效地从内部类访问成员?
- 通过多个类访问成员时出错
- 如何在使用对象指针时访问成员函数
- 为什么相应成员不能正确访问成员函数指针
- 从两个不同类继承的非虚拟基类的访问成员
- 如何使用 gcc 内联汇编器代码访问成员变量
- 如何使用常数向量访问成员函数
- 访问成员函数中参数的类成员
- C++嵌套结构初始化和访问成员
- 通过指向班级第一个成员的指针访问成员是不确定的行为吗?
- 如何使用C STD :: SET中的迭代器访问成员功能
- 访问成员C 时,结构的向量生成了范围的错误
- 带指针的班级访问成员
- 从聚合类访问成员变量
- 如何访问成员变量 sqlite 回调
- ctypes/C++segfault访问成员变量
- 通过父类型的指针或直接从派生类访问成员函数的差异