При запуске кода я получаю следующие ошибки, и кажется, что я пробовал все, чтобы их устранить, но ничего не работает. Мы будем очень признательны за любые предложения или объяснения того, что я делаю неправильно. Вот ошибки: В моем коде в «class Integer: public Number» говорится: «! Ожидаемое имя класса» и в «Целое число (const Double & d);» там написано: "! Неизвестное имя типа 'Double'; вы имели в виду 'double'?"

Вот возможный код в Integer.h , который содержит ошибки:

#ifndef INTEGER
#define INTEGER

#include "Number.h"
#include "Double.h"

namespace MyNamespace {

using std::string;

class Double;

class Integer : public Number

{

private:

    void create(int i);

    bool NaN(string s, int iCount);

    bool nan;

public:

    //Constructors

    Integer();

    Integer(int i);

    Integer(const Integer &i);

    Integer(const Double &d);  //ERROR HERE = "Unknown type 'Double'"

    Integer(string s);


    void equals(int i);

    void equals(string s);

    Integer add(const Integer &i);

    Integer sub(const Integer &i);

    Integer mul(const Integer &i);

    Integer div(const Integer &i);

    Integer add(int i);

    Integer sub(int i);

    Integer mul(int i);

    Integer div(int i);

    int toInt() const;


    //Print
    void printInteger();


    // operator overloads

    Integer operator + (const Integer &i);

    Integer operator - (const Integer &i);

    Integer operator * (const Integer &i);

    Integer operator / (const Integer &i);

    Integer operator = (const Integer &i);

    Integer operator = (int i);

    Integer operator = (string s);

    string toString() const;

    bool operator == (const Integer &i);

    bool operator == (int i);

    bool operator != (const Integer &i);

    bool operator != (int i);


    bool isNan();

};
}

#endif

Number.h

#ifndef NUMBER
#define NUMBER

#include <iostream>
#include <string>

namespace MyNamespace {

using std::string;

class Number : public string
{

public:

    Number();

    Number(string s);


};

}

#endif

Double.h

#ifndef DOUBLE
#define DOUBLE

#include "Number.h"
#include "Integer.h"

namespace MyNamespace
{

class Integer;    

class Double : public Number

{

private:

    void create(double d);

    bool NaN(string s, int dCount);

    bool nan;

public:

    // Constructors

    Double();

    Double(double d);

    Double(const Double &d);

    Double(const Integer &i);  //ERROR HERE = "Unknown type 'Integer'"

    Double(string s);


    void equals(double d);

    void equals(string s);

    Double add(const Double &d);

    Double sub(const Double &d);

    Double mul(const Double &d);

    Double div(const Double &d);

    Double add(double d);

    Double sub(double d);

    Double mul(double d);

    Double div(double d);

    double toDouble() const;

    //Print
    void printDouble();

    // operator overloads

    Double operator + (const Double &d);

    Double operator - (const Double &d);

    Double operator * (const Double &d);

    Double operator / (const Double &d);

    Double operator = (const Double &d);

    Double operator = (double d);

    Double operator = (string s);

    string toString() const;

    bool operator == (const Double &d);

    bool operator == (double d);

    bool operator != (const Double &d);

    bool operator != (double d);


    bool isNan();

};
}

#endif
2
user1 3 Май 2014 в 08:23

2 ответа

У вас есть циклическая зависимость между Integer и Double. Если вы не используете эти встроенные, у вас могут быть просто предварительные объявления и удалить #include «Integer.h» и #include «Double.h».

Если вы хотите использовать эти встроенные, вы можете включить дополнительные файлы для встроенных реализаций:

#ifndef NUMBER_H
#define NUMBER_H

#include <iostream>
#include <string>


namespace MyNamespace {

// Please do not put the using into the global namespace
using std::string;

class Number : public string {};

}
#endif

// =============================================================================

#ifndef INTEGER_H
#define INTEGER_H

#include "Number.h"

namespace MyNamespace {

class Double;
class Integer : public Number
{
public:
    Integer(const Double &d);
};
}

#endif

#include "Integer.tcc"

// =============================================================================

// Integer.tcc
#ifndef INTEGER_H
#error Please include Integer.h instead
#endif

#include "Double.h"

namespace MyNamespace {
    inline Integer::Integer(const Double &d) {}
}

// =============================================================================

#ifndef DOUBLE_H
#define DOUBLE_H

#include "Number.h"

namespace MyNamespace
{

class Integer;
class Double : public Number
{
public:
    Double(const Integer &i);
};
}

#endif

#include "Double.tcc"

// =============================================================================

// Double.tcc
#ifndef DOUBLE_H
#error Please include Double.h instead
#endif

#include "Integer.h"

namespace MyNamespace {
    inline Double::Double(const Integer &d) {}
}
2
user2249683user2249683 3 Май 2014 в 05:25

Я бы поспорил, что Number и Double, если они вообще определены, определены в пространстве имен и должны быть уточнены.

1
user3344003 3 Май 2014 в 04:30