2015-12-28 5 views
-4

Я хочу получить доступ к закрытым объектам класса 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"); 
    } 
} 

ОШИБКА

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

Объясните, что вы думаете, 'ui' должно означать внутри функции' узнано' –

+0

Это не имеет ничего общего с пространствами имен, 'узнал' и' MainWindow' оба находятся в глобальном пространстве имен –

+0

Извините, я забыл рассказать об признанных, i возможно, параметры, потому что setOnRecognizeAction() нуждаются только в LaPSAPI :: RecoResult, и я не могу объявить распознанный внутри MainWindow также потому, что у меня будет эта ошибка: ошибка: нет соответствующей функции для вызова в 'LapsAPI :: SREngine :: setOnRecognizeAction (void (MainWindow :: *) (LapsAPI :: RecoResult *)) ' –

ответ

0

recognized - бесплатная функция. Хотя вы дали ему доступ к именам членов MainWindow, он не является членом MainWindow, и нет объектов MainWindow, неявно связанных с функцией.

Обычно, чтобы исправить это, вы дадите еще один параметр функции. Однако, поскольку ваша функция используется как функция обратного вызова и должна иметь фиксированную подпись, вы не можете этого сделать здесь.

Если вы хотите, чтобы код внутри recognized мог влиять на любые объекты, вам придется использовать глобальные переменные. Например, у вас может быть глобальный экземпляр MainWindow или глобальный указатель, который указывает на экземпляр, вызывающий в настоящее время функцию startRecognition (и убедитесь, что вы не вызываете это из нескольких потоков ...)

(Это не очень хороший дизайн в LapsAPI, но вы не можете его изменить, поэтому вам нужно работать с ним).

+0

У вас возникла проблема, спасибо, ха-ха! я не могу объявить или случайные параметры, поэтому я подумал, что функция друга решит мою проблему вызова частного объекта без случайного LapsAPI, но я думаю, что у меня нет другого выбора, так как программное обеспечение будет большим, и у меня могут быть проблемы в будущем с это ... thks nway! : D –

-1

recognized() не MainWindow метод. Вы не передаете указатель или ссылку на MainWindow экземпляр до recognized(). Неудивительно, что компилятор жалуется на неопределенный символ.

+0

Ваш ответ должен действительно предложить решение –

+0

@MM правильно относится к проблеме, которая может вызвать с помощью указателя-указателя, но для ответа ответит! –