Как перенести объекты из массива объектов в другой в C ++? - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть массив объектов, и я хочу перенести объекты в другой массив. Я написал код ниже, чтобы сделать это, но это не сработало. По сути, это код, в котором 52 объекта карты создаются в одном массиве и распределяются между двумя массивами. Кто-нибудь может мне помочь?

class card
{
public:
    string suit;
    string value;
    void setValue(string v);
    void setSuit(string s);
};
void card::setValue(string v)
    {
        value=v;
    }
void card::setSuit(string s)
    {
        suit=s;
    }
int main()
{
    string suites[]={"Spades","Hearts","Diamonds","Clubs"};
    string values[]={"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
    card cards[52];
    int i=0;
        for(int j=0;j<4;j++){
            for(int k=0;k<13;k++){
                cards[i].setSuit(suites[j]);
                cards[i].setValue(values[k]);
                i++;
            }
        }
    card player1_cards[26];
    card player2_cards[26];
    for(int a=0;a<52;a++){
        if(a%2==0){
                player1_cards[a]=cards[a];
        }
        else{
            player2_cards[a]=cards[a];
        }
    }
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 13 апреля 2020

Как отмечает @Eljay, вы пытаетесь получить доступ к элементам после конца массивов. Если бы вы использовали отладчик для пошагового выполнения вашей программы, вы бы увидели это.

Однако, это также урок для вас, чтобы быть осторожным в написании сырых циклов, с большим индексов "magi c -number" и предпочитают использовать ранее существующие шаблоны из библиотек (особенно std :: алгоритма), когда это уместно. См. этот разговор Шона Родителя об этом общем принципе.

В частности, вы могли бы написать свою программу следующим образом:

#include <range/v3/view.hpp>
#include <string>
#include <array>
#include <iostream>

struct card {
    std::string suite;
    std::string value;
};

std::ostream& operator<<(std::ostream& os, const card& c)
{
    return os << c.value << " of " << c.suite; 
}

int main()
{
    using namespace ranges;

    std::array suites {"Spades","Hearts","Diamonds","Clubs"};
    std::array values {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
    auto cards = 
        views::cartesian_product(suites, values) | 
        views::transform([](const auto& suite_and_value) -> card { 
            return { std::get<0>(suite_and_value), std::get<1>(suite_and_value) };
        });
    auto num_players { 2 };
    auto player1_cards =
        cards | views::stride(num_players);
    auto player2_cards = 
        cards | views::drop(1) | views::stride(num_players);
    std::cout << "Player 1 got: " << player1_cards << '\n';
    std::cout << "Player 2 got: " << player2_cards << '\n';
}

, в этом случае вы этого не сделаете используйте любые петли и любые индексные переменные. Для этого используется библиотека Eri c Niebler range-v3 . См. Также этот краткий справочник , чтобы быстрее понять, что происходит в этом коде, если вы не знакомы с терминами.

См. Live on GodBolt .

0 голосов
/ 13 апреля 2020

Если вы хотите, чтобы каждая вторая карта добавлялась к player1_cards, а остальные добавлялись к player2_cards, вы можете изменить свой for-l oop на:

for(int a=1;a<26;a++) {
    player1_cards[a] = cards[2*a];
    player2_cards[a] = cards[2*a-1];
}

Как сказал Эльджай в комментарии к вашему вопросу ваш индекс прошел за конец массива.

Я попытался скомпилировать код сам, и кажется, что следующий код разбивает карты на два разных массива, хотя это не случайно (который вы можете добавить, если играете в карточную игру).

#include <iostream>
#include <string>

class card
{
public:
    std::string suit;
    std::string value;
    void setValue(std::string v);
    void setSuit(std::string s);
    std::string printSV();
};
void card::setValue(std::string v)
    {
        value=v;
    }
void card::setSuit(std::string s)
    {
        suit=s;
    }

std::string card::printSV() {
    return suit + ": " + value + "\n";
}

int main()
{
    std::string suites[]={"Spades","Hearts","Diamonds","Clubs"};
    std::string values[]={"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
    card cards[52];
    int i=0;
        for(int j=0;j<4;j++){
            for(int k=0;k<13;k++){
                cards[i].setSuit(suites[j]);
                cards[i].setValue(values[k]);
                i++;
            }
        }
    card player1_cards[26];
    card player2_cards[26];
    for(int a=1;a<26;a++){
        player1_cards[a] = cards[2*a];
        player2_cards[a] = cards[2*a-1];
// prints the suite and value for each card in player1's and player2's hand.
        std::cout << player1_cards[a].printSV();
        std::cout << player2_cards[a].printSV();
    }
    return 0;
} 

Вывод Suite: Value для каждой из карт в cards[52].

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