C++ 多态性;{token";错误之前应为类名

C++ 多态性;{token";错误之前应为类名,c++,polymorphism,C++,Polymorphism,我知道这已经被发布了很多次了,但是没有一个解决方案能够提供帮助。我正在尝试从一个超类创建多个子类(在这个例子中,Value->Fraction->RationalFraction和Value->Fraction->unrationalfraction),但我一直遇到这个错误。我假设它来自循环包含,但我不知道如何让分数代码在没有它的情况下工作。当我构造分数时,根据构造函数,它会创建一个无理或有理分数,但我需要在这些子类中包含分数,它会创建一个集群。错误是com有没有更流畅的方法来实现这一点,或者至

我知道这已经被发布了很多次了,但是没有一个解决方案能够提供帮助。我正在尝试从一个超类创建多个子类(在这个例子中,Value->Fraction->RationalFraction和Value->Fraction->unrationalfraction),但我一直遇到这个错误。我假设它来自循环包含,但我不知道如何让分数代码在没有它的情况下工作。当我构造分数时,根据构造函数,它会创建一个无理或有理分数,但我需要在这些子类中包含分数,它会创建一个集群。错误是com有没有更流畅的方法来实现这一点,或者至少有一种方法来修复这个错误?对不起,如果这个问题已经得到了回答,我还是个新手

#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
理性分离

#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
#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
#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 |错误:在“{”标记之前应该有类名|
include\unrationalfraction.h | 5 |错误:在“{”标记之前应该有类名|

||===构建失败:2个错误,0个警告(0分钟,0秒))===

理性操作的第8行。h表示

class RationalFraction: public Fraction
但是该文件中没有声明任何分数。您必须

如果您计划使用中声明的内容


请注意,
Fraction.h
包括
RationalFraction.h
iteslf。如果您不解决这个问题,您将遇到循环头依赖性问题,这基本上意味着没有任何东西可以工作。您可能希望使用
RationalFraction
unrationalfraction
的前向声明,而不是包括它们的标题。

我认为您的设计不是很好,但除此之外,还有一些明显的问题:

1您使用未声明的名称,例如RationalFraction.h中的
分数

2您可以使用指向对象的指针(如
RationalFraction*rtF;
),而无需对象的定义:您所需要的只是一个声明。

您缺少一些“#include”s


当您实现继承时,编译器希望您从类继承。而且编译器不知道“分数”是一个类,因为您不包括他的.h文件。

您不能有像有理分数和分数这样的类相互嵌入。您应该使用一种称为正向声明的技术。()。简而言之,这意味着您可以像下面这样声明两个类RationalFraction和unrationalfraction,而不包括两个头文件。您需要的只是保留两个指向这些类的指针,这样指针的大小是固定的,并且由编译器知道(4或8字节,取决于您电脑的处理器体系结构)

#ifndef分数
#定义分数
#包括“Value.h”
#包括
使用名称空间std;
阶级理性主义;
类非理性;
类别分数:公共价值
{
私人:
合理分配*rtF;
虚拟分数*simplify()=0;
非理性分数*irF;
公众:
...
...
};

您必须在RationalFraction.h和unrationalfraction.h中包含Fraction.h。此外,当您在Fraction.h中包含RationalFraction.h和unrationalfraction.h时,编译器碰巧找到了类声明

class  RationalFraction: public Fraction
在看到分数的声明之前。您只能使用完全声明的类作为基类。您可以通过在分数中正向声明有理分数和非有理分数来解决此问题。h:

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

using namespace std;

class RationalFraction;
class IrrationalFraction;

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
#ifndef分数
#定义分数
#包括“Value.h”
#包括
使用名称空间std;
阶级理性主义;
类非有理分数;
类别分数:公共价值
{
私人:
合理分配*rtF;
虚拟分数*simplify()=0;
非理性分数*irF;
公众:
分数(int n,int d);
分数(字符串n,int d);
虚拟分数();
虚拟字符串getType()=0;
整数;
int-denom;
受保护的:
};
#endif//分数
这会通知编译器存在类RationalFraction和unrationalfraction。对于正向声明的类型,您不能做很多事情,因为编译器不知道关于类的任何事情,特别是对象的大小。但是您可以做的是delcare指针和对它们的引用,因此对于Fraction来说,这就足够了


我不确定在基类构造函数中实例化子类时,在Fraction::Fraction中会发生什么。我猜这是一个无限递归。我猜你想要工厂之类的东西,但它不是这样工作的。

1首先你需要替换
比率的includenalFraction.h
非理性Fraction.h
具有前向类声明,如下所示:

class RationalFraction;
class IrrationalFraction;
2其次,您需要在文件
Fraction.cpp
中添加这些包含项

3第三,您需要在
RationalFraction.h
unrationalfraction.h
中添加
Fraction.h
的包含项

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

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

6第六,为了避免双重删除,即未定义的行为,您必须禁止复制或处理复制。处理复制的一种方法是使用智能指针而不是原始指针。另一种方法是定义复制构造函数和复制赋值运算符(这有点过于简化了,但你可以很容易地找到细节:谷歌的“三法则”)

7分数的构造函数
无条件调用
非理性分数的构造函数
,其中
class  RationalFraction: public Fraction
#ifndef FRACTION_H
#define FRACTION_H
#include "Value.h"
#include <string>

using namespace std;

class RationalFraction;
class IrrationalFraction;

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
class RationalFraction;
class IrrationalFraction;