2015-12-28 73 views
-4

我想訪問類別爲MainWindow的私人對象,朋友功能void recognized(RecoResult *result)已在參數result中擁有另一個名稱空間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"); 
    } 
} 

ERROR

/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'應該在'recognised'函數內意味着什麼 –

+0

這與命名空間,'識別'和'MainWindow'都不是全局命名空間 –

+0

對不起,我忘了告訴我認識的,我因爲setOnRecognizeAction()只需要一個LaPSAPI :: RecoResult,所以我不能在MainWindow中聲明識別,因爲我會遇到這個錯誤: 錯誤:沒有匹配函數調用'LapsAPI :: SREngine :: setOnRecognizeAction void(MainWindow :: *)(LapsAPI :: RecoResult *))' –

回答

0

recognized是一項免費功能。雖然您已授予其訪問MainWindow成員的名稱的權限,但它不是MainWindow的成員,並且沒有與該函數隱式關聯的對象MainWindow

通常要解決這個問題,你會給函數另外一個參數。但是,由於你的函數被用作回調函數,並且它必須有固定的簽名,所以你不能這樣做。

如果你想裏面recognized代碼能夠影響任何對象,你將不得不使用全局變量。例如,您可以擁有MainWindow的全局實例,或指向當前調用startRecognition函數的實例的全局指針(並確保您不會從多個線程調用此函數...)

(這不是在LapsAPI中一個非常好的設計,但是你不能改變它,所以你必須使用它)。

+0

你有問題,謝謝哈哈!我不能申報或機會參數,所以我認爲,朋友功能將解決我的問題沒有機會調用私人對象LapsAPI,但我想我沒有另一種選擇,因爲軟件將是大的,我可能在未來的問題與這......不用說! :d –

-1

recognized()不是MainWindow方法。您沒有將指針或對MainWindow實例的引用傳遞給recognized()。難怪編譯器抱怨未定義的符號。

+0

你的答案應該真的提出一個解決方案 –

+0

@MM是正確的問題,會導致與傳遞指針,但thks的答案! –