首页 文章

和一个 class 交朋友

提问于
浏览
1

我正在尝试与一个类成为朋友,以便它能够到达它的私有构造函数 .

在some_file.h中

class B;    

namespace some_name {
class A {
  public:
    A() {}
  private:
    A (int x) {}
    friend class ::B;
};
}

在other_file.h中

#include "some_file"

namespace {
class B {
  protected:
    A* get_a(int x) { return new A(x); }
};   
}

编译此代码时,我得到 - 错误:'some_name :: A :: A(int)'是私有的 .

我现在,这是私人的,这就是我成为朋友的原因B.我在这里做错了什么?你不能和你的构造者成为朋友吗?是否有命名空间问题?

谢谢

4 回答

  • 9

    这样做:

    namespace {
    class B {
      protected:
        A* get_a(int x) { return new A(x) };
    }   
    }
    

    您不是将 B 放在根(全局)命名空间中,而是放在匿名命名空间中 .

    因此 ::B 无法到达 B .

    如果您希望 B 位于根(全局)命名空间中,则根本不要将其与 namespace 括起来 . 这应该可以解决问题 .

  • 1

    您只在全局命名空间中转发声明和派生的B类 . 无论如何都不是命名空间中的B类 . 您需要完全限定B的名称 .

    编辑:谢谢你 .
    我犯了一个小错误 . 它有一个问题是因为你是真的 . 你需要把B从匿名命名空间中取出来 - 无论如何都是无题的 .

  • 0

    问题是您将 B 称为 ::B 而不是 B . 这意味着,你告诉编译器 B 是一个全局名称,但事实上它在匿名命名空间内并不是't: it' . 你只是认为它可能没有按照你的预期去做 . 因为匿名命名空间位于 Headers 中,所以它意味着什么's inside that namespace is linked statically to any implementation file that includes the header. That'不是很有用,因为你什么都不隐藏 . 您也可以删除该匿名命名空间 .

  • 0

    你不能和你的构造函数成为朋友吗?

    您可以如下所示

    struct B{
        B();
        void f();
    };
    
    struct A{
        friend B::B();
    private:
        A(){}
    };
    
    B::B(){A a;}       // fine
    
    void B::f(){A a;}  // error
    
    int main(){
    }
    

相关问题