Przesłanie struktury do funkcji

0

Posiadam klasę, w której zadeklarowałem strukturę, przechowującą współrzędne:

#include <iostream>
#include <vector>
using namespace std;
using std::vector;

using MAP_GRID = vector<vector<string>>;
void change_position(MAP_GRID &, int, int);

class vehicles{
private:
	double durability;
	double velocity;
	//int move;
public:
	 vehicles(double d, double v) : durability(d), velocity(v) {}
	 ~vehicles() {}

	 void drive();
	 virtual void info() { cout << durability << " " << velocity << "\n"; }

	 struct position{
		 vector<int> x;
		 vector<int> y;
	 };

	 friend class tanks;
	 friend class armored_car;
	 
};

Są one wykorzystywane w poniższej funkcji:

void set_position(MAP_GRID &MAP, int x, int y, vehicles::position &pos, string object)
{
	if (x <= MAP.size() || y <= MAP.size())
		if (MAP[x][y] != "[ ]")
			std::cout << "\nPosition is occupied" << std::endl;
		else
		{
			MAP[x][y] = object;
			pos.x.push_back(x);
			pos.y.push_back(y);
		}
			
	else
		std::cout << "\Choose correct position" << std::endl;
}

W funkcji main.cpp, stworzyłem sobie obiekt klasy, która dziedziczy z vehicles:

class tanks:public vehicles{
private:
	double damage;
public:
	tanks(double dmg, double v, double d, int m) :vehicles(d, v), damage(dmg), ammo(m) {}
	int ammo;
	void shoot();
	void info();
};

Jak teraz użyć funkcji set_position, by przesłać do niej współrzędne stworzonego obiektu? Na razie mam takie wywołanie:

set_position(MAP, 5, 5, ?, "[x]");

Docelowo planuję stworzyć kilka klas-córek od vehicles.

2

Musisz mieć intancję tego typu i ją przekazać, tak samo jak przekazujesz np. mapę. Nie wiem w czym konkretnie problem

2

Każdy obiekt klasy tanks jest obiektem klasy vehicles (swoją drogą powinno być raczej Tank i Vehicle), więc funkcja, która przyjmuje vehicles przyjmuje również tanks.

Natomiast w Twoim przypadku set_position() przyjmuje nie vehicles, tylko vehicles::position, przy czym

  1. klasa vehicles nie ma nigdzie zmiennej tego typu. Zadeklarowałeś jedynie typ o nazwie position.
  2. gdybyś miał taką zmienną, która jest w public, to tanks też automatycznie by to miało.

Nie czyni się klas pochodnych zaprzyjaźnionymi. Jak klasa pochodna ma mieć dostęp do czegoś niepublicznego, to wtedy to coś powinno być protected.

1

Zadeklarowałem zmienną wewnątrz vehicles https://imgur.com/KLOVYcV teraz próbuje to wywołać set_position(MAP, 5, 5, pos,"[x]");

vehicles ferrari(10, 200);
set_position(MAP, 5, 5, ferrari.pos, "[x]");

tanks tiger(1000, 20, 200, 5);
set_position(MAP, 6, 6, tiger.pos, "[y]");
0

Tak

set_position(MAP, 5, 5, t34.pos,"[x]");

już próbowałem. Niestety kompilator tego nie przepuszcza b8c19c8f7a.png

1

Jak masz parę plików z deklaracjami klas to na samej górze dodaj sobie #pragma once, to sprawi że dane klasy będą definiowane tylko raz

0

Po uporania się z tymi definicjami, zostały mi dwa błędy:
296b2842a6.png

1

Brzmi jakbyś nie miał definicji funkcji set_position, albo plik ją zawierający nie był częścią projektu.

0

Definicje mam w pliku terrain.cpp:

void set_position(MAP_GRID &MAP, int x, int y, vehicles::position &pos, string object)
{
	if (x <= MAP.size() || y <= MAP.size())
		if (MAP[x][y] != "[ ]")
			std::cout << "\nPosition is occupied" << std::endl;
		else
		{
			MAP[x][y] = object;
			pos.x.push_back(x);
			pos.y.push_back(y);
		}
			
	else
		std::cout << "\Choose correct position" << std::endl;
}

Dołączyłem go do projektu.
f0f49cbac0.png

Po usunięciu 4 argumentu funkcji:

void set_position(MAP_GRID &MAP, int x, int y, string object)
{
	if (x <= MAP.size() || y <= MAP.size())
		if (MAP[x][y] != "[ ]")
			std::cout << "\nPosition is occupied" << std::endl;
		else
		{
			MAP[x][y] = object;
			//pos.x.push_back(x);
			//pos.y.push_back(y);
		}
			
	else
		std::cout << "\Choose correct position" << std::endl;
}

wszystko działa.

0

Podejrzewam że bez sensu pliki h sobie podłączałeś.
Wypisz co dołącza każdy z tych plików, zarówno .h jak .cpp

0

mechanics.cpp

#include "stdafx.h"
#include "vehicles.h"
#include <iostream>
#include <vector>

definicje: tanks::shoot(), tanks::info()

terrain.cpp

#include "stdafx.h"
#include <iostream>
#include <vector>
#include "vehicles.h"

definicja: set_position(MAP_GRID &MAP, int x, int y, vehicles::position &pos, string object)

vehicles.h

#include <iostream>
#include <vector>

klasy

class.cpp

#include "stdafx.h"
#include "vehicles.h"
#include <iostream>
#include <time.h>
//void set_position(MAP_GRID &, int, int, vehicles::position, string);//
//_tmain(int argc, _TCHAR* argv[])//
//tanks t34(12, 0.5, 21,6);
set_position(MAP, 5, 5, t34.pos, "[x]");//

dodanie znacznika <code class="cpp"> - @furious programming

2
void set_position(MAP_GRID &, int, int, vehicles::position, string);

to nie jest to samo co:

void set_position(MAP_GRID &MAP, int x, int y, vehicles::position &pos, string object)

W pierwszym parametr typu vehicles::position jest przekazany przez wartość, w drugim przez referencję.

1 użytkowników online, w tym zalogowanych: 0, gości: 1