2011-08-16 16 views
1

問題があります。私は何か本当にばかなことをやっていると思います。私はC++とQtの新人です。QMapに項目を追加できません

私はクラスSavedVarを持っています。プライベートメンバーのQmapにキー/値を追加しようとしています。 SavedVar :: addVar()を呼び出すと、プログラムがクラッシュします。 SavedVar :: addvar()は 'id'と 'notes'を正しく受け取っています。私はQtのクリエイターでデバッグ出力を理解するのに苦労してい

#include <QObject> 
#include <QMap> 
#include "variation.h" 
#include <QTableWidget> 
#include "mainwindow.h" 

class SavedVar : public QObject 
{ 
    Q_OBJECT 
public: 
    explicit SavedVar(QObject *parent = 0); 
    void addVar(QString id, QString notes); 
    void saveVar(QString varText); 
    void removeSavedVar(QList <QTableWidgetItem*> &varList); 
    QString generateSaveFile(); 
    void loadVarFile(QString filename); 
    const QMap<QString, QString>*getVmapPtr(); 

private: 
    QMap <QString, QString> vmap; 

}; 

void SavedVar::addVar(QString id, QString notes) 
{ 
    vmap[id]= notes; 
} 

0 QBasicAtomicInt::operator!= qbasicatomic.h 75 0x4116e3  
1 QMap<QString, QString>::detach qmap.h 202 0x41ede2  
2 QMap<QString, QString>::operator[] qmap.h 526 0x41d241  
3 SavedVar::addVar savedvar.cpp 17 0x44afc9  
4 SavedVar::loadVarFile savedvar.cpp 82 0x44b4b8  
5 MainWindow::load_data mainwindow.cpp 190 0x40d5fe 

乾杯、

ニール

+0

「QString」などの重い*オブジェクトは、値ではなく参照やポインタで渡す必要があります。それを除けば、私はあなたの問題のヒントを与えるそのコード内の何も見ることができません。問題はコードの別の部分にあるようです。たとえば、不正な形や空の場合など、 'addVar'を入力する文字列を確認してください。 –

+1

@Diego Devilla:投稿されたコードに間違いがないようです。参照やポインタによるQStringの格納は、必要ありません。 QStringは暗黙的な共有(コピーオンライト)を使用します。 –

+2

'SavedVar :: loadVarFile'は' addVar'呼び出しまで、 'MainWindow :: load_data'は' loadVarFile'呼び出しまで見ることができますか?これは 'addVar'を悪い' this'ポインタで呼び出している可能性があり、コードはクラッシュする前に関数呼び出しをいくつか追加します。 –

答えて

-1

あなたはQMap方法を挿入するとしようと試みたことがありますか?

void SavedVar::addVar(QString id, QString notes) 
{ 
    vmap.insert(id, notes); 
} 
+0

私はこれと同じ結果を試しました。ありがとう – nrhorner

2

たぶん、あなたはそうすることによって、QMapのオブジェクトを初期化しませんでした:

vmap = new(QMap <QString, QString>); 

その後、あなたは(挿入を使用してオブジェクトを操作)し、削除することができます()。

関連する問題