我知道以前已经发布过很多次了,但是这些解决方案都无济于事。我正在尝试从一个超类创建多个子类(在这种情况下,Value-> Fraction-> RationalFraction和Value-> Fraction-> IrrationalFraction),但是我一直收到此错误。我假设它来自循环包含,但是我不知道如何使分数代码在没有它的情况下工作。当我构造Fraction时,根据构造函数的不同,它会创建Irrational或Rational Fraction,但是随后我需要在这些子类中包括Fraction,并且它会创建一个集群。错误出现在RationalFraction和IrrationalFraction中,我似乎无法解决它。是否有一种更平滑的方法来实现此目的,或者至少有一种方法来纠正错误?抱歉,如果已经回答了这个问题,我还是多态的新手。

值h

#ifndef VALUE_H
#define VALUE_H

#include <string>
using namespace std;

class Value
{
public:
    Value();
    virtual ~Value();
    string type;
    virtual string getType() = 0;

protected:
private:
    virtual Value* simplify() = 0;
};

#endif // VALUE_H


分数h

#ifndef FRACTION_H
#define FRACTION_H
#include "Value.h"
#include "RationalFraction.h"
#include "IrrationalFraction.h"
#include <string>

using namespace std;


class Fraction: public Value
    {
    private:
    RationalFraction* rtF;
    virtual Fraction* simplify() = 0;
    IrrationalFraction* irF;
public:
    Fraction(int n, int d);
    Fraction(string n, int d);
    virtual ~Fraction();
    virtual string getType() = 0;
    int numer;
    int denom;
protected:

};

#endif // FRACTION_H


分数

#include "Fraction.h"

#include <iostream>

using namespace std;

Fraction::Fraction(int n, int d) {
    rtF = new RationalFraction(n,d);
}
Fraction::Fraction(string n, int d){
    irF = new IrrationalFraction(n, d);
}

Fraction::~Fraction()
{
    delete rtF;
    delete irF;
}


非理性分数

#ifndef IRRATIONALFRACTION_H
#define IRRATIONALFRACTION_H

class IrrationalFraction : public Fraction
{
    public:
        IrrationalFraction(string n, int d);
        virtual ~IrrationalFraction();
    protected:
    private:
        IrrationalFraction* simplify();
};

#endif // IRRATIONALFRACTION_H


RationalFraction.h

#ifndef RATIONALFRACTION_H
#define RATIONALFRACTION_H

using namespace std;


class RationalFraction: public Fraction
{
    public:
        RationalFraction(int n, int d);
        virtual ~RationalFraction();
        int numer;
        int denom;
    protected:
    private:
        RationalFraction* simplify();
};

#endif // RATIONALFRACTION_H


谢谢你们!

这是错误消息:
include\RationalFraction.h|8|error: expected class-name before '{' token|include\IrrationalFraction.h|5|error: expected class-name before '{' token|||=== Build failed: 2 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

最佳答案

1首先,您需要用正向类声明替换RationalFraction.hIrrationalFraction.h的包含,如下所示:

class RationalFraction;
class IrrationalFraction;


2其次,您需要在文件Fraction.cpp中添加这些包含文件。

3第三,您需要在Fraction.hRationalFraction.h中添加IrrationalFraction.h的包含。

4第四,您需要在这两个类中添加getType的实现。

5第五,为避免名称冲突等严重问题,您需要从标题中删除using namespace std;

6第六,为避免重复删除(即未定义行为),您必须禁止复制或处理复制。处理复制的一种方法是使用智能指针而不是原始指针。另一个是定义复制构造函数和复制赋值运算符(这有点过分简化,但是您可以轻松找到详细信息:google表示“三个规则”)。

7 Fraction的构造函数无条件调用IrrationalFraction的构造函数,后者又调用Fraction的构造函数。这是一个无限递归,必须以某种方式解决。在开始测试时,您会发现这一点。



这里的设计看起来很像Java。

您考虑过班模板吗?

10-04 19:47