开发者

Problem using Friend function in QT

开发者 https://www.devze.com 2023-02-19 02:46 出处:网络
I wish to add items in a ListWidget, which is a private member of a class, through a friend function. Actually, i am trying this sample snippet to use friend function for more classes to update their

I wish to add items in a ListWidget, which is a private member of a class, through a friend function. Actually, i am trying this sample snippet to use friend function for more classes to update their ListWidgets from a single function.

I need guidance in using friend function in my case.

Kindly forgive my ignorance on the topic, any help is appreciated.

    class InBoxTab : public QWidget
    {
    Q_OBJECT

    public:
        InBoxTab(QWidget *parent = 0);
       // InBoxTab();
        ~InBoxTab();

    public slots:
        void hello();
        friend void adda(); // friend function
    private:
        QListWidget* listWidget1; //data member accessed by friend function
    };



    void adda()
    {
        InBoxTab I;

        I.listWidget1->insertItem(1,QString("added frm fn"));

        I.listWidget1->update();
    }


InBoxTab::InBoxTab(QWidget *parent) :
        QWidget(parent)
{
        开发者_StackOverflow中文版listWidget1 = new QListWidget(this);

        QListWidgetItem* item = new QListWidgetItem("Item 1 added frm tab1 ");

        listWidget1->addItem(item);
        adda();   // Call to friend function

        QVBoxLayout* layout = new QVBoxLayout(this);
        layout->addWidget(listWidget1);
        this->setLayout(layout);
}


As far as I can see, the 'adda' function does not affect anything. It returns nothing, and only operates on 'I' which is deleted when 'adda' is finished.

An example of how I believe you could use a friend function would be if you declared/defined 'adda' as:

void adda(InBoxTab *I)
{
        I->listWidget1->insertItem(1,QString("added frm fn"));
        I->listWidget1->update();
}

... Although in that particular case there is no reason not to make 'adda' a member of the InBoxTab instead.


void adda()
{
    InBoxTab I;

    I.listWidget1->insertItem(1,QString("added frm fn"));

    I.listWidget1->update();
}

InBoxTab::InBoxTab(QWidget *parent) :
          QWidget(parent)
{
    // ...

    adda();   // Call to friend function

    // ..
 }

In the function adda(), a new object called I is created. So, constructor is called and constructor inturn calls again adda() and the process goes on . I see an infinite recursion which is the problem.


Edit:

InBoxTab(QWidget *parent = 0); // Since parent is initialized to 0 if nothing 
                               // is passed to constructor up instantiation 

InBoxTab I; // Invokes the above constructor and an infinite recursion results.
0

精彩评论

暂无评论...
验证码 换一张
取 消