从成员对象调用方法

Calling method from member object

本文关键字:方法 调用 成员对象      更新时间:2023-10-16

我在调用作为某个类成员的对象的成员方法时遇到问题。我的意思是?我有班级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

叮.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

人.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:QtProjectsTutorialqt2cperson.cpp:28: error: undefined reference to `CPosition::toString()'

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

当您使用 定义toString()方法时

QString toString()
{
   //code
}

cposition.cpp文件中的原型,它不是CPosition类的成员。这就是为什么当您尝试从类型 CPosition 的指针调用此方法m_position 时,您会收到未定义的引用错误,因为您尚未实现cposition.h文件中贴花的 toString() 方法。

将文件中toString()方法的原型从 cposition.cpp

QString toString()

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

以便编译器知道cposition.cpp文件中实现toString()方法是cposition.h文件中声明的方法。

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

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