好友功能无法访问私人成员

Friend function cannot access private member

本文关键字:成员 访问 功能 好友      更新时间:2023-10-16

我想使用朋友函数void recognized(RecoResult *result)访问类MainWindow的私有对象,该函数在参数result中已经有另一个命名空间LapsAPI::RecoResult。如何访问此好友功能中的Ui::MainWindow *ui

主窗口.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "main.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT
    friend void recognized(RecoResult *result);
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
private slots:
    void on_pushButton_clicked();
private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

主窗口.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "main.h"
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}
void MainWindow::on_pushButton_clicked()
{
    // Iniciando classe de reconhecimento
    SREngine* en;
    en = new SREngine("clara.jconf");
    // Inicio do reconhecimento de voz
    en->setOnRecognizeAction(&recognized);
    en->startRecognition();
    printf("Ola!n");
    printf("Reconhecendon");
    sleep(100);
    en->stopRecognition();
}
MainWindow::~MainWindow()
{
    delete ui;
}
void recognized(RecoResult *result){
    if(result->getConfidence() > TRUST){
        cout << result->getUterrance() << " Confiança " << result->getConfidence() << endl;
        string uterrance = "";
        float confidence = 0.0;
        uterrance = result->getUterrance();
        confidence = result->getConfidence();
        cout << "MENSAGEM RECONHECIDA SEM FILTROS: " << uterrance << " " << confidence << "n" << endl;
        ui->textBrowser->append("RECONHECIDA");
  }
}

错误

/home/dayannefernandes/GitHub/clara-interface/clara-ui/mainwindow.cpp:44: error: 'ui' was not declared in this scope
     ui->textBrowser->append("MENSAGEM RECONHECIDA");
     ^

recognized是一个自由函数。尽管您已授予它访问MainWindow成员名称的权限,但它不是MainWindow的成员,并且没有与函数隐式关联的MainWindow对象。

通常情况下,要解决此问题,您需要为函数提供另一个参数。但是,由于您的函数被用作回调函数,并且它必须具有固定的签名,因此您不能在此处执行此操作。

如果您希望recognized中的代码能够影响任何对象,则必须使用全局变量。例如,你可以有一个MainWindow的全局实例,或者一个指向当前调用startRecognition函数的实例的全局指针(并确保你不会从多个线程调用它…)

(这在LapsAPI中不是一个很好的设计,但你不能改变它,所以你必须使用它)。

recognized()不是MainWindow方法。您没有将指向MainWindow实例的指针或引用传递给recognized()。难怪编译器抱怨未定义的符号。