简体   繁体   中英

Yet another 'not declared in this scope' issue when it is declared

I'm currently working on a card program for a class andI'm running into an issue where the compiler is telling me that things are not being declared in the scope when they are and some things are not declared at all when it is. Here is the code:

Card.h:

#ifndef _CARD_H
#define _CARD_H

#include <iostream>
#include <string>

using namespace std;

enum RANK{Joker, Ace = 1, Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King}
enum SUIT{Clubs, Diamonds, Hearts, Spades}

class Card
{
private:
    //Rank and Suit variables for all cards
    int rank;
    int suit;

public:
    //Constructors
    Card();
    Card(int r, int s);

    //Getters
    int getRank();
    int getSuit();

    //Setters
    void setRank(int r);
    void setSuit(int s);

    //toString
    string toString();
};

#endif

Card.cpp:

#ifndef _CARD_H
#define _CARD_H
#include "Card.h"
#include <iostream>
#include <string>

using namespace std;

//Default constructor
Card::Card()
{
    rank=Joker;
    suit=Clubs;
}

//Constructor
Card::Card(int r, int s)
{
    rank = r;
    suit = s;
}

//Getters for rank and suit
int Card::getRank()
{
    return rank;
}
int Card::getSuit()
{
    return suit;
}

//Setters for rank and suit
void Card::setRank(int r)
{
    rank = r;
}
void Card::setSuit(int s)
{
    suit = s;
}

//toString function for output
string Card::toString()
{
    string tempstring = ""; //list of if-else statements for what to add to the string that gets printed
    if (rank == 0)
    {
        tempstring += "Joker";
        goto stringEnd; //sends the process to the end of the list if rank is Joker so it doesn't attempt to add a suit to the card toString
    }
    else if (rank == 1)
        tempstring += "Ace of ";
    else if (rank == 2)
        tempstring += "Two of ";
    else if (rank == 3)
        tempstring += "Three of ";
    else if (rank == 4)
        tempstring += "Four of ";
    else if (rank == 5)
        tempstring += "Five of ";
    else if (rank == 6)
        tempstring += "Six of ";
    else if (rank == 7)
        tempstring += "Seven of ";
    else if (rank == 8)
        tempstring += "Eight of ";
    else if (rank == 9)
        tempstring += "Nine of ";
    else if (rank == 10)
        tempstring += "Ten of ";
    else if (rank == 11)
        tempstring += "Jack of ";
    else if (rank == 12)
        tempstring += "Queen of ";
    else if (rank == 13)
         tempstring += "King of ";
    if (suit == 0)
        tempstring += "Clubs";
    else if (suit == 1)
        tempstring += "Diamonds";
    else if (suit == 2)
        tempstring += "Hearts";
    else if (suit == 3)
        tempstring += "Spades";
    stringEnd:
    return tempstring;
}

#endif

I'm not sure why it's not compiling right. Everything seems alright to me.

You should not use #include guards in a .cpp file. Your .h file is basically not being parsed at all because _CARD_H is already defined.

  1. Missing semicolons at the end of enum declarations.
  2. Includes are not needed in Card.cpp except #include "Card.h"

So, Card.h will be like

#ifndef _CARD_H
#define _CARD_H

#include <iostream>
#include <string>

using namespace std;

enum RANK{Joker, Ace = 1, Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King};
enum SUIT{Clubs, Diamonds, Hearts, Spades};

class Card{
private:
    //Rank and Suit variables for all cards
    int rank;
    int suit;
public:
    //Constructors
    Card();
    Card(int r, int s);

    //Getters
    int getRank();
    int getSuit();

    //Setters
    void setRank(int r);
    void setSuit(int s);

    //toString
    string toString();
};

#endif

And Card.cpp will be like

#include "Card.h"
//Default constructor
Card::Card()
{
    rank=Joker;
    suit=Clubs;
}

//Constructor
Card::Card(int r, int s)
{
    rank = r;
    suit = s;
}

//Getters for rank and suit
int Card::getRank()
{
    return rank;
}
int Card::getSuit()
{
    return suit;
}

//Setters for rank and suit
void Card::setRank(int r)
{
    rank = r;
}
void Card::setSuit(int s)
{
    suit = s;
}

//toString function for output
string Card::toString()
{
    string tempstring = ""; //list of if-else statements for what to add to the string that gets printed
    if (rank == 0)
    {
        tempstring += "Joker";
        goto stringEnd; //sends the process to the end of the list if rank is Joker so it doesn't attempt to add a suit to the card toString
    }
    else if (rank == 1)
        tempstring += "Ace of ";
    else if (rank == 2)
        tempstring += "Two of ";
    else if (rank == 3)
        tempstring += "Three of ";
    else if (rank == 4)
        tempstring += "Four of ";
    else if (rank == 5)
        tempstring += "Five of ";
    else if (rank == 6)
        tempstring += "Six of ";
    else if (rank == 7)
        tempstring += "Seven of ";
    else if (rank == 8)
        tempstring += "Eight of ";
    else if (rank == 9)
        tempstring += "Nine of ";
    else if (rank == 10)
        tempstring += "Ten of ";
    else if (rank == 11)
        tempstring += "Jack of ";
    else if (rank == 12)
        tempstring += "Queen of ";
    else if (rank == 13)
         tempstring += "King of ";
    if (suit == 0)
        tempstring += "Clubs";
    else if (suit == 1)
        tempstring += "Diamonds";
    else if (suit == 2)
        tempstring += "Hearts";
    else if (suit == 3)
        tempstring += "Spades";
    stringEnd:
    return tempstring;
}

It should compile fine.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM