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

时间:2015-12-28 23:26:38

标签: c++ qt private friend-function

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

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

mainwindow.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("Reconhecendo\n");
    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");
  }
}

ERROR

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

2 个答案:

答案 0 :(得分:0)

recognized是一个免费功能。虽然您已授予其MainWindow成员姓名的访问权限,但它不是MainWindow的成员,并且没有与该函数隐式关联的MainWindow个对象。

通常要修复此问题,您需要为该函数提供另一个参数。但是,由于您的函数被用作回调函数并且它必须具有固定签名,因此您无法在此处执行此操作。

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

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

答案 1 :(得分:-1)

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