C ++私有构造函数(带参数)不允许实例化

时间:2012-03-18 14:00:12

标签: c++ constructor private friend

我的私有构造函数出现问题如下:

Lane.hpp:

namespace sim_mob
{
class B
{

    friend class A;

private:
    B(int){}

};
}

xmll.hpp:

#include"Lane.hpp"
namespace geo
{
class A
{
public:
    A()
    {
        sim_mob::B b(2);
     }
};
}

main.cpp中:

#include"xmll.hpp"



int main()
{
    geo::A a;
    return 0;
}

命令: $ g ++ main.cpp

In file included from main.cpp:2:0:
Lane.hpp: In constructor ‘geo::A::A()’:
Lane.hpp:10:5: error: ‘sim_mob::B::B(int)’ is private
xmll.hpp:9:23: error: within this context

关键是如果我在构造函数中没有任何参数,我就不会收到此错误。我可以知道为什么我会得到这个以及如何解决它? 非常感谢

3 个答案:

答案 0 :(得分:6)

在课程sim_mob::B中,你会成为一个班级sim_mob:A,但你希望这种友谊延伸到geo::A,而这显然不会。geo::A。要解决此问题,您需要在成为朋友之前声明namespace geo { class A; } namespace sim_mob { class B { friend class geo::A; private: B(int){} }; }

sim_mob::B b();

我猜,它与默认构造函数“一起工作”的事实是你宁愿声明一个函数而不是实例化一个对象:

{{1}}

是一个函数声明。如果你不使用括号,你应该得到一个关于默认构造函数不存在的错误,或者,如果你实际声明它,则不能访问。

答案 1 :(得分:3)

转发声明:

namespace geo{
class A;
}

在B班:

friend class geo::A;

答案 2 :(得分:0)

当前命名空间中的

friend class A;个朋友类A,即sim_mob::A,而不是geo::A。您需要声明该类,然后使用完全限定名称:

namespace bar { struct bar; }
namespace foo {
    struct foo {
    private:
        friend struct bar::bar;
        explicit foo(int) {}
    };
}

namespace bar {
    struct bar {
        bar() { foo::foo x(42); }
    };
}