C ++通过引用而不是值传递

时间:2018-04-11 01:47:31

标签: c++ qt

我做了比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);

我有什么遗失的东西吗?新运算符返回指针不是吗?

2 个答案:

答案 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

它将是重复的,因为编译器在构造对象时不知道要调用哪一个。