我用C ++编写的静态库。 我也拿到了头文件在静态库中定义的类。
我可以访问静态库中引入类声明友元函数定义的类的私有成员?
我用C ++编写的静态库。 我也拿到了头文件在静态库中定义的类。
我可以访问静态库中引入类声明友元函数定义的类的私有成员?
你的意思是你想改变附带库中的头? 这是不以任何方式保证添加friend
报关单会有工作。 你可能搞乱了连接部分,即使你的编译器说,这是好的。
此外,如果这些成员是private
,你就是不访问它们。
这在技术上是未定义的行为 ,以便使用令牌的不同序列的不同转换单元来定义同一个实体(这里的一类)。
无论你使用TECHNIC,只要它改变令牌组成它的序列,它是从视标准点邪恶的(尽管可能在实践工作)。
约翰内斯发现了一种方法来做到这一点,同时尊重标准。 正是基于这样的事实,即使a
是类私有属性A
, &A::a
不能写在上下文中写Aa
(也许是在标准的监督?)。
核心方法:
template<typename Tag, typename Tag::type M>
struct Rob {
friend typename Tag::type get(Tag) {
return M;
}
};
// use
struct A {
A(int a):a(a) { }
private:
int a;
};
// tag used to access A::a
struct A_f {
typedef int A::*type;
friend type get(A_f);
};
template struct Rob<A_f, &A::a>;
int main() {
A a(42);
std::cout << "proof: " << a.*get(A_f()) << std::endl;
}
扩展简单:
template<typename Tag, typename Member>
struct TagBase {
typedef Member type;
friend type get(Tag);
};
struct A_f : TagBase<A_f, int A::*> { };
编辑 :
这招(可笑) 明确允许通过标准
§14.7.2/ 12的一般访问检查规则并不适用于用来指定明确的实例名称。 [...]