Member 14085956 Ответов: 3

Я запускаю следующие коды C++ и получаю предупреждение: control достигает конца функции non-void


#include <iostream>
#include <algorithm>
#include <vector>
#include <cstdlib>
#include <ctime>

using namespace std;

enum suits
{
    diamond, club, heart, spade
};

class Card
{
private:
    int rank;
    suits suit;
public:
    Card();
    Card(suits, int);
    int getRank() { return rank; }
    suits getSuit() { return suit; }
    void setRank(int rankvalue) { rank = rankvalue; }
    void setSuit(suits suitvalue) { suit = suitvalue; }
};

ostream & operator<<(ostream &, Card);

Card::Card()
{
    rank = 1;
    suit = spade;
}

Card::Card(suits suitvalue, int rankvalue)
{
    rank = rankvalue;
    suit = suitvalue;
}

ostream & operator<<(ostream & out, Card aCard)
{
    switch (int rank = aCard.getRank())
    {
        case 14: out << "Ace"; break;
        case 11: out << "Jack"; break;
        case 12: out << "Queen"; break;
        case 13: out << "King"; break;
        default: out << rank;
    }
    
    switch (suits suit = aCard.getSuit())
    {
        case diamond: out << " of Diamonds"; break;
        case spade: out << " of Spades"; break;
        case heart: out << " of Hearts"; break;
        case club: out << " of Clubs"; break;
    }
    
    return out;
}

class RandomInteger
{
public:
    RandomInteger();
    unsigned int operator() (unsigned int max);
};

RandomInteger::RandomInteger()
{
    srand(time(0));
}

unsigned int RandomInteger::operator()(unsigned int max)

{
    unsigned int rval = rand();
    return rval % max;
}

RandomInteger randomizer;

class Deck
{
    Card cards[52];
    int topCard;
public:
    Deck();
    void shuffle();
    bool isEmpty() { return topCard <= 0; }
    Card draw();
};

extern RandomInteger randomizer;

Deck::Deck()
{
    topCard = 0;
    for (int i = 1; i <= 13; i++)
    {
        Card c1(diamond, i), c2(spade, i), c3(heart, i), c4(club, i);
        cards[topCard++] = c1;
        cards[topCard++] = c2;
        cards[topCard++] = c3;
        cards[topCard++] = c4;
    }
}

Card Deck::draw()
{
    if (!isEmpty())
        return cards[--topCard];
    else
    {
        Card spadeAce(spade, 1);
        return spadeAce;
    }
}

void Deck::shuffle()
{
    random_shuffle(cards, cards+52, randomizer);
}

class Player
{
public:
    Player();
    void print();
    Card draw(Deck &);
    typedef vector<card> cards;
    vector<cards> column;
};

//ostream & operator<<(ostream &, Player&);

Player::Player()
{
    column.push_back(vector<card>());
    column.push_back(vector<card>());
    column.push_back(vector<card>());
    column.push_back(vector<card>());
}

Card Player::draw(Deck & aDeck)
{
    for (int i = 0; i < 4; i++)
        column[i].push_back(aDeck.draw());
    
}

void Player::print()
{
    cout << "Col 1 \t\t Col 2 \t\t Col 3 \t\t Col 4 \n";
    bool more = true;
    for (int j = 0; more; j++)
    {
        more = false;
        for (int i = 0; i < 4; i++)
            if (j < column[i].size())
            {
                cout << column[i][j] << "\t";
                more = true;
            }
            else
                cout << "\t\t";
        cout << endl;
    }
}

int main()
{
    Deck deck;
    deck.shuffle();
    
    Player player;
    player.draw(deck);
    //while (!deck.isEmpty())
    //{
    cout << "Enter a column number (0 to draw four new cards): " << endl;
    //}
    player.print();
    
    int input;
    int i;
    vector<vector<card> > columns(4);
    while (cin >> input)
        if (input == 0 )
        {
            player.draw(deck);
            player.print();
            columns.push_back(vector<card>());
            columns.push_back(vector<card>());
            columns.push_back(vector<card>());
            columns.push_back(vector<card>());
        }
        else while (cin >> input)
            if (input == 1)
            {
                for ( i = 0; i > 4; i++)
                {
                    columns.push_back(vector<card>());
                }
                for ( i = 0; i > 4; i++)
                {
                    columns[0].back().getSuit();
                    columns[1].back().getSuit();
                    columns[2].back().getSuit();
                    columns[3].back().getSuit();
                }
             
            }
    
}


Что я уже пробовал:

я попытался поставить return 0; в конце моего int main (), но я все еще получаю то же самое предупреждение

Rick York

Один комментарий к вашему стилю кодирования: Я думаю, что вы должны поставить скобки вокруг утверждений, которые не обязательно нуждаются в них. Я думал в первую очередь о цикле while в вашей основной функции. Я бы написал это так:

    while (cin >> input)
    {
        if (input == 0 )
        {
            player.draw(deck);
            player.print();
            columns.push_back(vector<card>());
            columns.push_back(vector<card>());
            columns.push_back(vector<card>());
            columns.push_back(vector<card>());
        }
        else while (cin >> input)
        {
            if (input == 1)
            {
                for ( i = 0; i > 4; i++)
                {
                    columns.push_back(vector<card>());
                }
                for ( i = 0; i > 4; i++)
                {
                    columns[0].back().getSuit();
                    columns[1].back().getSuit();
                    columns[2].back().getSuit();
                    columns[3].back().getSuit();
                }
            }
        }
    }

Patrice T

Сообщение компилятора также сообщает вам, где находится проблема.
Ты тоже собираешься нам рассказать ?

3 Ответов

Рейтинг:
8

k5054

Проверьте выходные данные вашего компилятора - он должен сказать вам, в какой строке находится ошибка, что-то вроде:
пример.cpp:42 предупреждение: управление достигает конца функции non void.

Но когда я пытаюсь скомпилировать это, я получаю около 50 ошибок и предупреждений, так что вы можете внимательно посмотреть как на опубликованный код, так и на выходные данные вашего компилятора.

NB. Спасибо за повторную публикацию кода с отступами-хотя 200+ строк кода обычно не очень хорошо воспринимаются.


Рейтинг:
27

CPallini

Такое предупреждение должно быть наименьшей из ваших забот: ваш код выдает много ошибок, начиная со строки 133:

Цитата:
typedef vector<card> карты;
где ""карта" не была заявлена в этом объеме".

Сначала вы должны исправить ошибки компилятора, а затем сосредоточиться на предупреждениях.


Рейтинг:
14

Rick York

У вас есть две непустые функции, которые ничего не возвращают. Первый-это Card Player::draw(Deck &adeck), который должен вернуть карту, но не делает этого. Второй-main, который должен возвращать целое число.


Member 14090419

Ну, технически main на самом деле не требует возвращаемого значения, стандарт указывает, что компилятор вставит return 0; в конце main, если вы сами этого не сделаете.