使用Friend Class的构造函数

时间:2013-11-15 17:03:20

标签: c++ friend

我有两个A和B类.A已经宣布B为朋友。在B中我想在方法func()中实例化A(即我试图在B的构造函数之外实例化A)。令我惊讶的是,在C ++中似乎不允许这样做。这是代码:

class A {
public:
        friend class B;
        A(int x, int y) {
                x_ = x;
                y_ = y;
        }
protected:
        int x_, y_;
};

class B {
public: 
        B (int z) {
                z_ = z;
        }

        void func () {
                a (3,4);
        }
protected:
        A a;
        int z_
};

我收到以下错误:

friendConstructor.cpp: In constructor ‘B::B(int)’:
friendConstructor.cpp:14:12: error: no matching function for call to ‘A::A()’
friendConstructor.cpp:14:12: note: candidates are:
friendConstructor.cpp:4:2: note: A::A(int, int)
friendConstructor.cpp:4:2: note:   candidate expects 2 arguments, 0 provided
friendConstructor.cpp:1:7: note: A::A(const A&)
friendConstructor.cpp:1:7: note:   candidate expects 1 argument, 0 provided
friendConstructor.cpp: In member function ‘void B::func()’:
friendConstructor.cpp:19:9: error: no match for call to ‘(A) (int, int)’

我有一种情况,我无法在B类的构造函数中实现A类。在我实现A类之前,我必须等待一些事情发生。如果我想要做的事情在C ++中是不可能的。你能建议一个替代方案吗?

4 个答案:

答案 0 :(得分:2)

func中,a是一个成员变量,因此在构造B的实例时,它的实例已初始化(默认构造,因为您未指定初始化的方式)。它必须是 - 它是B的一部分。

您实际在做的是调用重载A::operator()。 “a(3,4)”语法仅表示在构造函数的声明或初始化列表中“使用这些参数构造”。

您的解决方案是向A添加成员函数,以允许您分配变量或构造临时和使用赋值。

 a = A(3,4);

答案 1 :(得分:1)

您需要自己初始化a,因为A不包含默认构造函数

class B {
public: 
        B (int z) : a(3,4) {
                z_ = z;
        }
protected:
        A a;
        int z_;
};

答案 2 :(得分:0)

正如错误所说,你正在进行函数调用,你可能想要这样的东西:

 a = A(3,4);

答案 3 :(得分:0)

A没有默认构造函数。由于每个A都有B的实例,B的默认构造函数会调用A的默认构造函数,该构造函数不存在。

关于你要做的事情:据我所知,成员变量应该在创建类实例后立即实例化。以这种方式思考 - 如果您在B中使用了不同的方法,我们将其称为func2(),即访问a。在我们调用func2之前,我们是否应该相信使用您的课程的人只是不使用func?不 - 这不是一个安全的编程实践。所以基本上,你应该确保在构造函数中实例化成员变量。

你可以通过@benjymous指出,通过使用指针,或者@kfsone和@dornhege指出,通过简单地分配给a一个新的{{1}来解决这个问题。实例(A)。但同样,我建议通常最好确保在类实例的生命周期中实例化成员变量。