我做了比C ++更多的C编程,所以我仍然试图围绕引用和指针。我在Qt中遇到了这个问题:
class node : public QObject
{
Q_OBJECT
public:
explicit node(QObject *parent = 0);
explicit node(QObject *parent = 0, QGraphicsRectItem * obj = Q_NULLPTR);
explicit node(QObject *parent = 0, QGraphicsRectItem * obj = Q_NULLPTR, int val = 0);
}
private:
QGraphicsRectItem * rect;
int terrain;
...
node::node(QObject *parent) : QObject(parent)
{
terrain = 0;
rect = Q_NULLPTR;
}
node::node(QObject *parent, QGraphicsRectItem *obj) : QObject(parent)
{
terrain = 0;
rect = obj;
}
node::node(QObject *parent, QGraphicsRectItem *obj, int val) : QObject(parent)
{
terrain = val;
rect = obj;
}
...
QObject * root = new QObject();
node * myNode = new node(root);
我想将根指针传递给我的节点构造函数,但是编译器抱怨我实际上是对一个不明确的指针传递引用:
mainwindow.cpp:26:错误:调用重载节点(QObject *&)'是 暧昧
node * mynode = new node(root);
我有什么遗失的东西吗?新运算符返回指针不是吗?
答案 0 :(得分:5)
确实你的构造函数不明确......
让我们尝试用简单的功能解释你的原因。
void f(int i, int j){cout<<i<<endl;}
void f(int i){cout<<i<<endl;}
很好......
BUT:
void f(int i, int j = 0){cout<<i<<endl;}
void f(int i){cout<<i<<endl;}
不好,你可以打电话:
f(2,3);
f(2);
编译器在调用f(2)时如何知道要使用哪个函数。它可能是:
void f(int i, int j = 0){cout<<i<<endl;}
或
void f(int i){cout<<i<<endl;}
默认参数是为了避免重写函数n次而发明的...... 删除声明:
explicit node(QObject *parent = 0);
explicit node(QObject *parent = 0, QGraphicsRectItem * obj = Q_NULLPTR);
一切都会好的: - )。
答案 1 :(得分:0)
如果要重载它,请避免构造函数中的默认参数定义。构造函数将是模糊的。编译器将不知道要调用哪个函数,因为它具有默认参数。可以使用单个参数以相同的方式调用所有构造函数。
explicit node(QObject *parent = 0);
explicit node(QObject *parent = 0, QGraphicsRectItem * obj = Q_NULLPTR);
explicit node(QObject *parent = 0, QGraphicsRectItem * obj = Q_NULLPTR, int val = 0);
如果您只使用一个参数来构造节点对象,那么它就像
node(parent) ;// first constructor
node(parent) ;// second constructor
node(parent) ;// third constructor
它将是重复的,因为编译器在构造对象时不知道要调用哪一个。