2017-03-19 9 views
2

いくつかのクラスのメンバであるオブジェクトのメンバメソッドを呼び出す際に問題があります。私が意味したのは?メンバオブジェクトからの呼び出し方法

cposition.h

#ifndef CPOSITION_H 
#define CPOSITION_H 

class CPosition 
{ 
public: 
    CPosition(QString name, QString description); 
    QString toString(); 

private: 
    QString m_name; 
    QString m_description; 

}; 

#endif // CPOSITION_H 

cposition.cpp

#include <QString> 
#include "cposition.h" 

CPosition::CPosition(QString name, QString description) 
    : m_name(name), m_description(description) 
{ 

} 

QString toString() 
{ 
    QString test("Test - method called!"); 
    return test; 
} 

そして、私はメンバーの1がCPositionオブジェクトへのポインタであるクラスCPersonを持っている:私はクラスCPositionを持っています。方法CPerson::getPositionでは、私は、ポインタが存在する場合にのみCPosition::getPositionメソッドを呼び出すしたいと思います:私はこのプロジェクトをビルドするとき

#ifndef CPERSON_H 
#define CPERSON_H 

class CPosition; 

class CPerson 
{ 
public: 
    CPerson(QString name); 
    QString getPosition(); 

private: 
    QString m_name; 
    CPosition * m_position; 
    CEmployer * m_employer; 
}; 

#endif // CPERSON_H 

がcperson.cpp

#include <QTextStream> 
#include <QString> 
#include "cperson.h" 
#include "cposition.h" 

CPerson::CPerson(QString name) : m_name(name){} 

QString CPerson::getPosition() 
{ 
    QString str; 
    QTextStream cout(&str); 
    if(m_position) //here check if pointer exist 
    { 
     cout << "Position: " << m_position->toString(); //<---- here is problem 
    } 
    else 
     cout << "Position doesn't exist!!!" << endl; 
    return str; 
} 

は私が手

cperson.hエラー:

C:\Qt\Projects\Tutorial\qt2\cperson.cpp:28: error: undefined reference to `CPosition::toString()' 

私はQtCreator IDEを使用しています。誰でもこの問題について私を助けたり、これがなぜ機能していないのか説明できますか?

答えて

2

あなたはcposition.cppファイルに

QString toString() 
{ 
    //code 
} 

プロトタイプを使用してtoString()メソッドを定義すると、それはCPositionクラスのメンバではありません。そのため、CPositionタイプのm_positionポインターからこのメソッドを呼び出そうとすると、ファイルでデコードされたtoString()メソッドが実装されていないため、未定義の参照エラーが発生します。

変更

QString toString() 

からcposition.cppファイル内toString()方法のプロトタイプ

QString CPosition::toString() 
{ 
    //write code here 
} 

になるように、コンパイラはcposition.cppファイルに実装toString()方法はcposition.hファイルで宣言1であることを知っています。

+0

ありがとうございます!私は非常に愚かな間違いを作った:) – drewpol

1

基本的には、toStringメソッドに実装を指定していません。正しい方法は次のようになります。

QString CPosition::toString() 
{ 
    QString test("Test - method called!"); 
    return test; 
} 
関連する問題