从成员对象

时间:2017-03-19 13:39:54

标签: c++ qt

我在调用某个类的成员对象的成员方法时遇到问题。我的意思是说?我上课CPosition

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;
}

然后我有一个类CPerson,其中一个成员是指向CPosition对象的指针。在方法CPerson::getPosition中,我只想在指针存在的情况下调用方法CPosition::getPosition

cperson.h

#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;
}

当我构建这个项目时,我收到一个错误:

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

我正在使用QtCreator IDE。有没有人可以帮我解决这个问题或解释为什么这不起作用?

2 个答案:

答案 0 :(得分:2)

使用

定义toString()方法时
QString toString()
{
   //code
}

原型在cposition.cpp文件中,它不是CPosition类的成员。这就是为什么当你尝试从类型为m_position的{​​{1}}指针调用此方法时,你会得到未定义的引用错误,因为你没有在{{1}中实现decalred CPosition方法文件。

更改toString()文件中cposition.h方法的原型
toString()

cposition.cpp

以便编译器知道QString toString() 文件中实现的QString CPosition::toString() { //write code here } 方法是toString()文件中声明的方法。

答案 1 :(得分:1)

基本上,您没有为toString方法提供实现。正确的方法应该是:

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