2017-06-30 1 views
0

Ich habe eine Funktion geschrieben, um einen Satz in Worte zu teilen, aber etwas ging schief, nachdem ich damit arbeiten wollte. mainwindow.cpp:Wie löst man einen nicht definierten Verweis auf die eigene C++ - Memberfunktion?

#include "mainwindow.h" 
#include "ui_mainwindow.h" 
#include <qdebug.h> 
#include <vector> 
#include <iostream> 
using namespace std; 
vector <QString> myvector; 
vector<string>::iterator it; 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
} 
MainWindow::~MainWindow() 
{ 
    delete ui; 
} 

void MainWindow::on_addButton_clicked() 
{ 
    QString str = ui->textEdit->toPlainText(); 
    //qDebug() << str; 
    vector<string> v = split(str.toStdString()); 
    for(int i = 0; i < myvector.size(); i++){ 
     ui->listWidget->addItem(myvector[i]); 
    } 

} 

vector<string> split(const string s) 
{ 
    vector<string> myvector; 
    typedef string::size_type string_size; 
    string_size i = 0; 
    while (i != s.size()) { 
     while (i != s.size() && isspace(s[i])) 
     ++i; 
     string_size j = i; 
     while (j != s.size() && !isspace(s[j])) 
     j++; 
     if (i != j) { 
     myvector.push_back(s.substr(i, j - i)); 
     i = j; 
     } 
    } 
    return myvector; 
} 

mainwindow.h

#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QMainWindow> 
#include <vector> 
#include <iostream> 
using namespace std; 
namespace Ui { 
class MainWindow; 
} 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 
    std::vector<string> split(const string s); 

private slots: 
    void on_addButton_clicked(); 

private: 
    Ui::MainWindow *ui; 
}; 

#endif // MAINWINDOW_H 

hier Fehler:

undefined reference to MainWindow::split(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)

+0

Für ein viel einfacheres Leben verwenden Sie 'std :: unique_ptr ' für Ihren 'ui' Typ. Ansonsten müssen Sie beim Kopieren Ihres Objekts vorsichtig sein. – Bathsheba

+0

Ich sehe keine MainWindow :: Split-Implementierung. Ich sehe eine Split() - Implementierung, aber nicht eine als Mitglied einer Klasse – UKMonkey

+0

Voting zu schließen, wie ein Tippfehler; Sie haben vergessen, die Funktion in der cpp-Datei zu qualifizieren. 'vector split (const string s) => vektor MainWindow :: split (const string s)' – NathanOliver

Antwort

2

Sie eine Memberfunktion in Mainwindow erklären und dann benutze es, aber du definieren:

vector<string> split(const string s) 

, dass eine eigenständige Funktion ist. Wahrscheinlich am einfachsten zu ändern:

vector<string> MainWindow::split(const string s) 

Eine besseren Lösung aber wäre split außerhalb der MainWindow Klasse zu erklären (es hat nichts mit Mainwindow zu tun hat, ist es nur eine nützliche litte Nutzenfunktion ist), und lassen Sie die Definition allein.

Ich würde auch das Argument zu const string& s ändern, um zu sparen, die Zeichenfolge zu kopieren (und ich stimme mit Bathsheba überein - verwenden Sie ein std :: unique_ptr, um das Löschen zu kümmern).

+0

Ich würde auch hinzufügen, dass für eigenständige Dienstprogramm-Funktionen sollten Sie wahrscheinlich anonyme 'Namespace {} '. – Resurrection

+1

Nur wenn Sie es nur in der einen Datei verwenden möchten. –

Verwandte Themen