我有两个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 ++中是不可能的。你能建议一个替代方案吗?
答案 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
)。但同样,我建议通常最好确保在类实例的生命周期中实例化成员变量。