Обновление переменной-члена объекта в функции, но не сохраняется - PullRequest
0 голосов
/ 11 декабря 2018

Я довольно новичок в c ++ и создаю простую игру на линкорах.У меня есть функция, которая инициализирует типы и длины кораблей, принимая вектор корабельных объектов.Я подтвердил, что тип и длина корабля обновляются внутри функции, но изменения не сохраняются в основной функции.Любая помощь будет принята с благодарностью.

#include <iostream>
#include <vector>
#include "ships.h"
#include "board.h"
#include "player.h"


using std::vector; 

void initialize_ships(vector<ship> &newFleet)
{
    vector<string> ship_types = { "carrier","battleship","submarine","cruiser","destroyer" };

    for (auto ii = 0; ii != newFleet.size(); ++ii)
    {
        newFleet[ii].type = ship_types[ii];
        newFleet[ii].setLength();
        if (newFleet[ii].type == "carrier")
        {
            std::cout << "Carrier in function has type: " << newFleet[ii].type << std::endl;
        }

    }
}

int main()
{


ship player_carrier, player_battleship, player_submarine, player_cruiser, player_destroyer;
vector<ship> player_fleet = {player_carrier, player_battleship, player_submarine, player_cruiser, player_destroyer };


initialize_ships(player_fleet);
std::cout << "Carrier in main has type: " << player_carrier.type << std::endl;



system("pause");
return 0; 

}

#ifndef  SHIPS_H
#define SHIPS_H

#include <iostream>
#include <string>


using std::string;

struct ship
{
    // ships member variables 
    int len;
    char dir; 
    int health; 
    int row;
    int col;
    char symb;
    string type; 

    void setLength()
    {
        if (type == "carrier")
        {
            len = 5;
        }
        else if (type == "battleship")
        {
            len = 4;
        }
        else if (type == "cruiser")
        {
            len = 3;
        }
        else if (type == "submarine")
        {
            len = 3;
        }
        else if (type == "destroyer")
        {
            len = 2;
        }
        else
        {
            std::cout << "Invalid ship type!" << std::endl;
        }
    }
};

#endif //  SHIPS_H

1 Ответ

0 голосов
/ 12 декабря 2018

Случайное создание копий является общей причиной того, что изменения будут «потеряны».Для этой конкретной ситуации, когда вы хотите, чтобы объекты в контейнере и имели имена для этих объектов (как если бы они были членами класса), разумно было бы сделать ссылки к объектам в контейнере:

vector<ship> player_fleet(5);
ship &player_carrier=player_fleet[0],
  &player_battleship=player_fleet[1],
  &player_submarine=player_fleet[2],
  &player_cruiser=player_fleet[3],
  &player_destroyer=player_fleet[4];

Будьте осторожны, чтобы не перераспределить vector, так как это сделает ваши ссылки недействительными.(Конечно, если он никогда не изменит размер, ship player_fleet[5]; будет достаточно.)

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