Использовать конструкторы.
struct Location {
int x; // 1 through fieldSize
char y; // 'a' through fieldSize
// constructor
Location(): x(-1), y(`*`)
{
)
};
Теперь каждый раз, когда вы делаете место, он всегда будет выходить с x == -1
и y == '*'
без каких-либо дополнительных усилий. С
struct Ship {
Location loc;
bool sunk;
Ship(): sunk(false)
{
}
};
каждый Ship
выходит из фабрики unsunk и на -1, '*'.
Так
Ship myFleet[fleetSize];
Просто сделал и инициализируется fleetSize
unsunk Ship
с при -1, '*' без каких-либо дополнительных усилий с вашей стороны.
Что касается передачи массива, то при вызове функции с массивом размер массива теряется. Прочтите What is array decaying?.
Так
void initialize(Ship[]);
может быть
void initialize(Ship ships[fleetsize]);
если fleetsize является константой времени компиляции, значение, заданное в коде и не может быть изменен таким образом, что компилятор может генерировать индексы массива, и знать размер, позволяющий некоторые оптимизации.
Или
void initialize(Ship * ships, size_t fleetsize);
если fleetsize
не является фиксированной величиной и может изменяться во время выполнения. Динамический fleetsize
может привести к тому, что программа должна управлять динамической памятью, и это может быть сложнее, чем кажется.
Но ...
C++ предлагает ряд «контейнеров», которые могут использоваться вместо массивов. Эти контейнеры знают свой размер, управляют динамической памятью для вас и, как правило, облегчают жизнь с помощью массива инструментов просеивания, поиска и сортировки, построенных прямо в or in the <algorithm>
library. Два, которые выглядят особенно полезными для вашего использования, - std::vector
, a dynamic array и std::array
, a statically-sized array.
Edit: Случайное МЕСТОПОЛОЖЕНИЕ
RNG установить код злорадно похищенное из: std::uniform_int_distribution
#include <random>
std::random_device rd; // cannot be trusted with mingw. Use time(null) instead
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(1, 5);
struct Location {
int x; // 1 through fieldSize
char y; // 'a' through fieldSize
// constructor. Note
Location()
{
do
{
x = dis(gen); // number
y = 'a'+dis(gen)-1; // requires sequentially ordered character set like ASCII
} while(locIsOccupied(x,y)); // ensure x and y are unused.
)
};
Я оставил locIsOccupied
невыполненным.
Еще один глупый трюк является
vector<Location> locations
, содержащий все возможные Locations
. random_shuffle
locations
и
struct Ship {
Location loc;
bool sunk;
// construct Ship with location from available pool
// using locations.back() because it's cheapest to remove the last item
Ship(): loc(locations.back()), sunk(false)
{
locations.pop_back(); // remove location so it can't be chosen again
}
};
Использование 'зЬй :: VECTOR' или' зЬй :: array'; их легче передать, чем массив. –
Прошу прощения, я должен был отметить, что это проект для школы. Мне грустно нужно использовать структуры :( – Inert
Так что используйте структуры. 'Vector' не останавливается на этом.' Std :: vector myFleet; 'Также читайте о конструкторах, которые сделают вашу работу намного проще даже с массивом –
user4581301