Наследование классов C ++ в разных файлах - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь изучить механизм наследования в C ++, я создал класс Bancnote (Bills) и хочу создать класс Card, наследующий все функции и переменные из класса Bancnote.

И я получаю этот тип ошибки:

include\Card.h|6|error: expected class-name before '{' token|

BANCNOTE.H

   #ifndef BANCNOTE_H
#define BANCNOTE_H
#include <iostream>

#include "Card.h"
using namespace std;

class Bancnote
{
    public:
        Bancnote();
        Bancnote(string, int ,int ,int );
        ~Bancnote( );
        int getsumacash( );
        void setsumacash( int );
        int getsumaplata( );
        void setsumaplata( int );
        int getrest( );
        void setrest( int );
        string getnume( );
        void setnume( string );
        void ToString();


    protected:

    private:
        string nume;
        int sumacash;
        int rest;
        static int sumaplata;


};

#endif // BANCNOTE_H

BANCNOTE.CPP

#include <iostream>
#include "Bancnote.h"
#include "Card.h"
using namespace std;
int Bancnote::sumaplata=0;

Bancnote::Bancnote(string _nume,int _sumacash,int _rest, int _sumaplata )
{
    this->nume=_nume;
    this->sumacash=_sumacash;
    this->rest=_rest;
    this->sumaplata=_sumaplata;
}

Bancnote::Bancnote()
{
    this->nume="";
    this->sumacash=0;
    this->rest=0;
    this->sumaplata=0;
}

Bancnote::~Bancnote()
{
    cout<<"Obiectul"<<"->" <<this->nume<<"<-"<<"a fost sters cu succes";
}

string Bancnote::getnume()
{
    return nume;
}
void Bancnote::setnume(string _nume)
   {
      this->nume=_nume;
   }
int Bancnote::getsumacash()
{
    return sumacash;
}
void Bancnote::setsumacash(int _sumacash)
{
    this->sumacash=_sumacash;
}
int Bancnote::getsumaplata()
{
    return sumaplata;
}
void Bancnote::setsumaplata(int _sumaplata)
{
    this->sumaplata=_sumaplata;
}
int Bancnote::getrest()
{
    return rest;
}
void Bancnote::setrest(int _rest)
{
    this->rest=_rest;
}
void Bancnote::ToString()
{
    cout<< "-----"<<getnume()<< "-----"<<endl;
    cout<<"Suma Cash: "<<this->getsumacash()<<endl;
    cout<<"Suma spre plata: "<<this->getsumaplata()<<endl;
    cout<<"Restul:"<<this->getrest()<<endl;

}

CARD.H

#ifndef CARD_H
#define CARD_H
#include "Bancnote.h"

class Card: public Bancnote
{
public:
    Card();
    virtual ~Card();

protected:

private:
};

#endif // CARD_H

1 Ответ

0 голосов
/ 11 января 2019

Вы перепутали включения. То, что у вас есть, более или менее это:

Bancnote.h:

#ifndef BANCNOTE_H
#define BANCNOTE_H
#include "Card.h"    // remove this

struct Bancnote {};
#endif

Card.h

#ifndef CARD_H
#define CARD_H
#include "Bancnote.h"

struct Card : Bancnote {};   // Bancnote is not yet declared
                             // when compiler reaches here

#endif

Когда в main вы включаете Bancnote.h, тогда этот заголовок включает Card.h, поэтому вы пытаетесь объявить Card до объявления Bancnote. На самом деле Bancnote не нуждается в определении Card, поэтому простое удаление включения должно исправить это.

PS: есть другие проблемы (см. Комментарии ниже вашего вопроса). Самое главное, не ясно, почему Card является Bancnote. Во-вторых, никогда не вставляйте using namespace std; в заголовок! (см. здесь почему)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...