【问题标题】:Qt 4 C++ Getting an error when using 3 classes that use each other, error: field `m_Employer' has incomplete typeQt 4 C++ 使用 3 个相互使用的类时出错,错误:字段“m_Employer”的类型不完整
【发布时间】:2011-02-09 20:21:16
【问题描述】:

我迫切需要帮助和指导。一直试图让它编译,但由于有 3 个类而不是数百个类,包含/转发声明应该如何在这里工作。

错误在 person.h 中标记。

除了错误,我在 main.cpp 中标记了一个警告。

这是一个控制台应用程序。

提前谢谢你。

人.h

#ifndef PERSON_H
#define PERSON_H
#include <QString>

class Employer;

class Person
{
    public:
        Person(QString name);
        QString toString() const;
        void setPosition(Employer newE, Position newP);
        Position getPosition() const;
    private:
        QString m_Name;
        bool m_Employed;
        Position m_Position;
        Employer m_Employer; //--> ERROR: field `m_Employer' has incomplete type.
};

#endif // PERSON_H

person.cpp

#include "employer.h"
#include "position.h"
#include "person.h"


Person::Person(QString name) : m_Name(name), m_Employed(false), m_Position(""), m_Employer("")
{
}



void Person::setPosition(Employer newE, Position newP)
{
    m_Position = newP;
    m_Employed = true;
    m_Employer = newE;
}

Position Person::getPosition()const
{
    return (m_Employed ? m_Position : Position("Professional nose-picker"));
}

QString Person::toString()const
{
    return m_Name + ", Employed: " + (m_Employed ? "Yes" : "No") + ", Position: " + getPosition().toString();
}

employer.h

#ifndef EMPLOYER_H
#define EMPLOYER_H
#include <QString>

//class Position;
//class Person;

class Employer
{
    public:
        Employer(QString name, QString market = "");
        void hire(Person &newHire, Position pos);
        QString toString() const;
    private:
        QString m_Name;
        QString m_Market;
};

#endif // EMPLOYER_H

雇主.cpp

#include "employer.h"
#include "person.h"
#include "position.h"


Employer::Employer(QString name, QString market) : m_Name(name), m_Market(market)
{
}

QString Employer::toString()const
{
    return m_Name + (m_Market != "" ? ", Market: " + m_Market : "");
}

void Employer::hire(Person &newHire, Position pos)
{
    newHire.setPosition(*this, pos);
}

位置.h

#ifndef POSITION_H
#define POSITION_H
#include <QString>

class Position
{
    public:
        Position(QString name, QString desc = "");
        QString toString() const;
    private:
        QString m_Name;
        QString m_Desc;
};

#endif // POSITION_H

位置.cpp

#include "position.h"

Position::Position(QString name, QString desc)
        :m_Name(name), m_Desc(desc)
{}

QString Position::toString()const
{
    return m_Name + (m_Desc != "" ? ", Description: " + m_Desc : "");
}

main.cpp

#include <QtCore/QCoreApplication>
#include <QTextStream>
#include "position.h"
#include "person.h" //--WARNING -> In file included from main.cpp:4:
#include "employer.h"



int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QTextStream cout(stdout);

    Person bob("Bob");
    Employer devCo("Dev Co");

    cout << bob.toString() << endl;
    bob.setPosition(is, Position("Developer", "Software Eng"));
    cout << bob.toString() << endl;
    cout << devCo.toString() << endl;

    return a.exec();
}

【问题讨论】:

    标签: c++ class qt4 console incomplete-type


    【解决方案1】:

    Person 类需要了解有关 Employer 的所有信息,因此需要将 Employer.h 包含在其中,而不是类前向声明​​。

    在这种情况下,人们需要知道 Employee 类的大小,因为您在类中存储了一个 Employee。

    如果您想解耦类并仅使用前向声明,则 Person 必须包含指向雇主的指针(原始或智能)。

    【讨论】:

      【解决方案2】:

      你需要看看things to consider when using forward declaration。通过使用前向声明,您不仅可以打破依赖关系,还可以通过不必包含大量标头来加快编译速度。

      你的具体问题的解决方案是这样的:

      #ifndef PERSON_H
      #define PERSON_H
      #include <QString>
      
      class Employer;
      
      class Person
      {
          public:
              Person(QString name);
              QString toString() const;
              void setPosition(Employer &newE, Position newP);
              Position getPosition() const;
          private:
              QString m_Name;
              bool m_Employed;
              Position m_Position;
              Employer *m_Employer;
      };
      
      #endif // PERSON_H
      

      【讨论】:

        【解决方案3】:

        谢谢各位!我最终移动了#include "employer.h" 和

        在 person.h 和 person.cpp 中包含“position.h”。

        然后修复了随后出现的一些其他错误。

        看起来我正在与何时何地使用包含或转发指令作斗争。需要进一步阅读。

        我喜欢你们用指针的想法去哪里。

        【讨论】:

          猜你喜欢
          • 2011-04-28
          • 2012-09-10
          • 2011-04-29
          • 1970-01-01
          • 2022-01-18
          • 2016-09-07
          • 1970-01-01
          • 2012-05-17
          • 1970-01-01
          相关资源
          最近更新 更多