Проблема с использованием функции Friend в QT - PullRequest
0 голосов
/ 24 марта 2011

Я хочу добавить элементы в ListWidget, который является частным членом класса, через функцию друга. На самом деле, я пытаюсь этот пример фрагмента использовать функцию друга для большего количества классов, чтобы обновить их ListWidgets из одной функции.

Мне нужно руководство по использованию функции друга в моем случае.

Пожалуйста, прости мое незнание по этой теме, любая помощь приветствуется.

    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)
{
        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);
}

Ответы [ 2 ]

0 голосов
/ 25 марта 2011

Насколько я вижу, функция 'adda' ни на что не влияет.Он ничего не возвращает и работает только с «I», которое удаляется после завершения «adda».

Примером того, как я считаю, вы могли бы использовать функцию друга, было бы, если бы вы объявили / определили «adda» как:

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

... Хотя в этом конкретном случае нет причин не превращать adda в член InBoxTab.

0 голосов
/ 24 марта 2011
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

    // ..
 }

В функции adda() создается новый объект с именем I.Итак, конструктор вызывается, и конструктор inturn вызывает снова adda(), и процесс продолжается.Я вижу бесконечную рекурсию , которая является проблемой.


Редактировать:

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.
...