友元函数访问静态库中定义的类的私有成员(Friend function access the pri

2019-09-28 04:16发布

我用C ++编写的静态库。 我也拿到了头文件在静态库中定义的类。

我可以访问静态库中引入类声明友元函数定义的类的私有成员?

Answer 1:

你的意思是你想改变附带库中的头? 这是不以任何方式保证添加friend报关单会有工作。 你可能搞乱了连接部分,即使你的编译器说,这是好的。

此外,如果这些成员是private ,你就是不访问它们。



Answer 2:

这在技术上是未定义的行为 ,以便使用令牌的不同序列的不同转换单元来定义同一个实体(这里的一类)。

无论你使用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的一般访问检查规则并不适用于用来指定明确的实例名称。 [...]



文章来源: Friend function access the private members of class defined in static library