好友功能无法访问私人成员
Friend function cannot access private member
我想使用朋友函数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()
。难怪编译器抱怨未定义的符号。
相关文章:
- 这是关于成员访问规则的正确摘要吗
- 为什么我在空指针错误(链表)中获取成员访问权限
- 成员访问是否在空指针上定义C++?
- C++ IDE 不会推断/自动完成对模板类中的 std::array 下标表达式的成员访问
- 为什么类成员数据必须是静态的才能被模板化类的模板化结构成员访问
- 为什么c++允许成员函数定义中实例的私有成员访问
- C/C++ 包含点的宏参数(成员访问运算符)
- 访问说明符(私有/公共/受保护)如何在内部工作(限制成员访问)?
- 如何将超类的受保护成员访问到其派生类. 如果已在派生类中声明了具有相同名称的函数?
- 内部类私有成员访问和封闭的友好性
- 通过 C++ 中的另一个结构成员访问结构
- 具体化 PRVALUES 成员访问的 decltype 行为不正确
- 常量表达式中的静态成员访问
- XVALUE来自类成员访问表达式
- 未经授权的私有类成员访问会产生编译时错误而不是运行时错误?
- 在 c++ 中,为什么 -> 被称为二进制中缀指针成员访问运算符?
- 如何访问模板参数的成员?“成员访问不完整的类型”
- 不明确的可变参数类成员访问
- C 受保护的成员访问
- 将typeID转换为静态成员访问(C )的命名空间