友元函数无法访问私有成员
Friend function cannot access private member
我想使用友元函数 void recognized(RecoResult *result)
访问 class MainWindow
的私有对象,该函数在参数 [=16= 中已经有另一个命名空间 LapsAPI::RecoResult
].我怎样才能访问这个好友函数中的 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");
}
}
错误
/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
实例的指针或引用传递给 recognized()
。难怪编译器会抱怨未定义的符号。
recognized
是一个免费功能。尽管您已授予它访问 MainWindow
成员名称的权限,但它不是 MainWindow
的成员,并且没有 MainWindow
对象与该函数隐式关联。
通常要解决此问题,您会为该函数提供另一个参数。但是,由于您的函数被用作回调函数并且它必须具有固定的签名,因此您不能在此处执行此操作。
如果您希望 recognized
中的代码能够影响任何对象,您将不得不使用全局变量。例如,你可以有一个 MainWindow
的全局实例,或者一个指向当前调用 startRecognition
函数的实例的全局指针(并确保你不从多个线程调用它......)
(这在 LapsAPI 中不是一个很好的设计,但您无法更改它,因此您必须使用它)。
我想使用友元函数 void recognized(RecoResult *result)
访问 class MainWindow
的私有对象,该函数在参数 [=16= 中已经有另一个命名空间 LapsAPI::RecoResult
].我怎样才能访问这个好友函数中的 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");
}
}
错误
/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
实例的指针或引用传递给 recognized()
。难怪编译器会抱怨未定义的符号。
recognized
是一个免费功能。尽管您已授予它访问 MainWindow
成员名称的权限,但它不是 MainWindow
的成员,并且没有 MainWindow
对象与该函数隐式关联。
通常要解决此问题,您会为该函数提供另一个参数。但是,由于您的函数被用作回调函数并且它必须具有固定的签名,因此您不能在此处执行此操作。
如果您希望 recognized
中的代码能够影响任何对象,您将不得不使用全局变量。例如,你可以有一个 MainWindow
的全局实例,或者一个指向当前调用 startRecognition
函数的实例的全局指针(并确保你不从多个线程调用它......)
(这在 LapsAPI 中不是一个很好的设计,但您无法更改它,因此您必须使用它)。