2016-07-25 9 views
0

まず、C++/Qtに慣れていないので、試してみました。C#でもやっています。ポインタの問題。「C++/Qtの-error/staticメンバ変数への未定義の参照」

ストーリー:私はQSerialPortを使用して、シリアル232ポートで読み書きします。もちろん、インスタンスが1つだけ存在する必要があります。それ以外の場合は、アクセスエラーが発生します。だから私の考えは、オブジェクトを保持する静的メンバー変数を定義することでした。

問題:

serialmanager.h

#include <QSerialPort> 
class SerialManager 
{ 
public: 
    static QSerialPort* getObj(); 
private: 
    static QSerialPort* obj; 
} 

serialmanager.cpp:私はいつも

ソースコードエラー "SerialManager::objに未定義の参照" を取得

#include "serialmanager.h" 
QSerialPort *obj = new QSerialPort(); 

QSerialPort* SerialManager::getObj() 
{ 
    if(!obj->isOpen()) 
    { 
     obj->setPortName("/dev/ttyO1"); //error line 
     obj->setBaudRate(QSerialPort::Baud57600); 
     //and so on... 
    } 
    return obj; 
} 
+0

以下の回答があります。ところで、インスタンスが1つだけ必要な場合は、1つのインスタンスを作成して静的変数を取り除くことができます – wasthishelpful

答えて

2

QSerialPort *obj = new QSerialPort(); 

を変更することにより、それを修正、クラスの名前が欠落しています。

ではなく、objを実装ファイルに定義しています。

修正プログラムはあなたがnullptrにそれを初期化したいかもしれません

QSerialPort *obj = new QSerialPort(); 

QSerialPort *SerialManager::obj = new QSerialPort(); 

に変更し、あなたがそれを必要なときにオンデマンドで構築することである(つまり、依存関係の問題を解決するかもしれません、および/またはプログラムの開始時間を向上させることができます)。

あなたが本当に唯一のこれまでの単一のオブジェクトを作成したい場合、あなたはまた、ポインタを作ることができる(ただし、尖った-するためのオブジェクト)の定数:誤って再び割り当てることから保護することができます

private: 
    static QSerialPort *const obj; 

(ことができますが、ユニットテストに別のオブジェクトを代入するのが難しくなります)。

+0

ありがとう!またnullptrの助言のために – Cheesi

1

あなたは、ヘッダー・ファイル内のSerialManager::objを宣言している、ヘッダファイルで

QSerialPort *SerialManager::obj = new QSerialPort(); 
+0

ありがとう! C++は本当に私の世界ではありません... – Cheesi

+0

しかし、C#はスコープ区切り文字が '::'ではなく '.'であることを除いて、この点で違いはありません。私が間違っている? –

関連する問題