• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Funkcja zwracająca pojedynczy element vectora struktur

Object Storage Arubacloud
0 głosów
455 wizyt
pytanie zadane 29 września 2020 w C i C++ przez nanautzin Obywatel (1,510 p.)
zamknięte 2 października 2020 przez nanautzin

Witam

Mam strukturę i vector :

	struct single_tile_out_for_bonus
	{
		int16_t id;
		int8_t type;
		int16_t x_position;
		int16_t y_position;
	};
	std::vector<single_tile_out_for_bonus>struct_bonus_out;

Potrzebuje funkcji która będzie zwracała pojedynczy element vectora (całą strukturę)?

Kombinowałem na różne sposoby i tak naprawdę nie wiem jaki typ powinna zwracać funkcja

Z góry dziękuję za pomoc

komentarz zamknięcia: Odpowiedzi rozwiązały problem
komentarz 29 września 2020 przez NewEraOfPeace Gaduła (4,790 p.)
Co dokładnie chcesz zrobić?
komentarz 29 września 2020 przez TOM_CPP Pasjonat (22,640 p.)

@nanautzin,
 Do czego potrzebna jest Ci ta funkcja? Nie prościej i szybciej zwrócić element  bezpośrednio z vectora?

auto element = struct_bonus_out[2];  // zakładam że vector ma co najmniej trzy elementy
cout << element.id << endl;

 

komentarz 30 września 2020 przez nanautzin Obywatel (1,510 p.)

W jednej funkcji tworze elementy vectora struct_bonus_out, a inną funkcja chciałbym je przekazać poza klasę i potrzebuje funkcji do tego, a dokładnie wyjaśniając:

- w klasie A tworze klasę B
- klasa B tworzy setki czasami tysiące obiektów klasy C
- z tych obiektów funkcją  w klasie B wybieram dziesiątki obiektów które spełniają dane kryteria
- z tych które spełniają kryteria, zapisuje do struktury:

	struct single_tile_out_for_bonus
	{
		int16_t id;
		int8_t type;
		int16_t x_position;
		int16_t y_position;
	};

- tworze vector tej struktury:

std::vector<single_tile_out_for_bonus>struct_bonus_out;

- jeżeli obiekt spełnia dane warunki, tworze kolejny element vectora i zapisuje jego dane

 

Co chce osiągnąć:

Chce stworzyć funkcje w klasie B która będzie przekazywała dany element tego vectora do klasy A

Np: 

jakiś_typ jakas_nazwa(int index)
{
       return element_vectora[index];
}

Kombinowałem na różne sposoby i nie mogę sobie z tym poradzić

2
komentarz 30 września 2020 przez TOM_CPP Pasjonat (22,640 p.)

Chce stworzyć funkcje w klasie B która będzie przekazywała dany element tego vectora do klasy A

Jeżeli wektor struct_bonus_out w klasie B jest w dostępie/zakresie publicznym, to nie potrzebujesz żadnej funkcji. Wystarczy bezpośrednio się do niego odnieść. W przypadku kiedy jest on elementem prywatnym lub chronionym klasy B, to używasz publicznej funkcji zwracającej dany element w oparciu o przekazany indeks. Sygnatura takiej funkcji będzie się różnić w zależności od tego, czy chcesz modyfikować zwracane elementy, czy też są one przeznaczone tylko do odczytu.

Jeżeli chcesz uzyskać dokładny przykład jak to zrobić, a nie tylko ogólną poradę, to powinieneś zamieścić cały kod odnoszący się do tego przypadku.

komentarz 30 września 2020 przez NewEraOfPeace Gaduła (4,790 p.)

Śmierdzi mi XY problem

komentarz 1 października 2020 przez nanautzin Obywatel (1,510 p.)

@TOM_CPP,

klasa B.hpp
 

#pragma once
#include <SFML/Graphics.hpp>
#include "Single_tile.hpp"
#include <fstream>
#include <vector>
#include <iostream>
#include <string>

class Object_lvl_ini
{
private:
	struct single_tile_out_for_bonus;

public:
	Object_lvl_ini(sf::RenderWindow& window);

	uint8_t system(sf::RenderWindow& window);
	void create_objects(sf::RenderWindow& window, std::string path_lvl, sf::Vector2f size_board);
	sf::Sprite* shape(uint32_t index);
	void initialization_structure(std::string type, sf::Vector2i position_tile);
	uint16_t no_tiles();
	struct single_tile_out_for_bonus tiles_setings_to_bonus(int16_t index);
	void draw(sf::RenderWindow& window);

private:
	sf::Texture tex001, tex002, tex003, tex004, tex005, tex006, tex007, tex008, tex009, tex010, tex011, tex012, tex013, tex014, tex015,
		tex016, tex017, tex018, tex020, tex021, tex022, tex023, tex024, tex101, tex102, tex103, tex104, tex105, tex106, tex107, tex108, temp_tex;
	uint8_t no_line, no_tiles_row;
	struct single_tile_out_for_bonus
	{
		int16_t id;
		int8_t type;
		int16_t x_position;
		int16_t y_position;
	};
	std::vector<single_tile_out_for_bonus>struct_bonus_out;
	std::vector<Single_tile>tiles_tex;
	std::string line, temp;
};

klasa B.cpp

#include "Object_lvl_ini.hpp"

Object_lvl_ini::Object_lvl_ini(sf::RenderWindow& window)
{
	this->tex001.loadFromFile("Game/Textures/Levels/001.png");
	this->tex002.loadFromFile("Game/Textures/Levels/002.png");
	this->tex003.loadFromFile("Game/Textures/Levels/003.png");
	this->tex004.loadFromFile("Game/Textures/Levels/004.png");
	this->tex005.loadFromFile("Game/Textures/Levels/005.png");
	this->tex006.loadFromFile("Game/Textures/Levels/006.png");
	this->tex007.loadFromFile("Game/Textures/Levels/007.png");
	this->tex008.loadFromFile("Game/Textures/Levels/008.png");
	this->tex009.loadFromFile("Game/Textures/Levels/009.png");
	this->tex010.loadFromFile("Game/Textures/Levels/010.png");
	this->tex011.loadFromFile("Game/Textures/Levels/011.png");
	this->tex012.loadFromFile("Game/Textures/Levels/012.png");
	this->tex013.loadFromFile("Game/Textures/Levels/013.png");
	this->tex014.loadFromFile("Game/Textures/Levels/014.png");
	this->tex015.loadFromFile("Game/Textures/Levels/015.png");
	this->tex016.loadFromFile("Game/Textures/Levels/016.png");
	this->tex017.loadFromFile("Game/Textures/Levels/017.png");
	this->tex018.loadFromFile("Game/Textures/Levels/018.png");
	this->tex020.loadFromFile("Game/Textures/Levels/020.png");
	this->tex021.loadFromFile("Game/Textures/Levels/021.png");
	this->tex022.loadFromFile("Game/Textures/Levels/022.png");
	this->tex023.loadFromFile("Game/Textures/Levels/023.png");
	this->tex024.loadFromFile("Game/Textures/Levels/024.png");
	this->tex101.loadFromFile("Game/Textures/Levels/101.png");
	this->tex102.loadFromFile("Game/Textures/Levels/102.png");
	this->tex103.loadFromFile("Game/Textures/Levels/103.png");
	this->tex104.loadFromFile("Game/Textures/Levels/104.png");
	this->tex105.loadFromFile("Game/Textures/Levels/105.png");
	this->tex106.loadFromFile("Game/Textures/Levels/106.png");
	this->tex107.loadFromFile("Game/Textures/Levels/107.png");
	this->tex108.loadFromFile("Game/Textures/Levels/108.png");
}

void Object_lvl_ini::create_objects(sf::RenderWindow& window, std::string path_lvl, sf::Vector2f size_board)
{
	no_line = 1;
	std::fstream file;
	//std::cout << path_lvl << std::endl;
	file.open(path_lvl, std::ios::in);
	if (file.good() == false)
	{
		std::cout << "File not exist" << std::endl;
		exit(0);
	}
	while (getline(file, line))
	{
		no_tiles_row = 0;
			for (int i = 0; i < line.size(); i++)
			{
				if (line[i] != ',')
				{
					temp = line[i];
					temp.append(line, i+1 , 2);
					if (temp == "000")
					{
						no_tiles_row++;
					}
					if (temp == "001")
					{
						tiles_tex.push_back(Single_tile(window, &tex001, sf::Vector2f(no_tiles_row * 100.0f, window.getSize().y - size_board.y + no_line * 100.0f)));
						no_tiles_row++;
						initialization_structure(temp, tiles_tex[tiles_tex.size() - 1].position_tile());

					}
					else if (temp == "002")
					{
						tiles_tex.push_back(Single_tile(window, &tex002, sf::Vector2f(no_tiles_row * 100.0f, window.getSize().y - size_board.y + no_line * 100.0f)));
						no_tiles_row++;
						initialization_structure(temp, tiles_tex[tiles_tex.size() - 1].position_tile());
						
					}
					else if (temp == "003")
					{
						tiles_tex.push_back(Single_tile(window, &tex003, sf::Vector2f(no_tiles_row * 100.0f, window.getSize().y - size_board.y + no_line * 100.0f)));
						no_tiles_row++;
						initialization_structure(temp, tiles_tex[tiles_tex.size() - 1].position_tile());
					}
					else if (temp == "004")
					{
						tiles_tex.push_back(Single_tile(window, &tex004, sf::Vector2f(no_tiles_row * 100.0f, window.getSize().y - size_board.y + no_line * 100.0f)));
						no_tiles_row++;
						initialization_structure(temp, tiles_tex[tiles_tex.size() - 1].position_tile());
					}
					else if (temp == "005")
					{
						tiles_tex.push_back(Single_tile(window, &tex005, sf::Vector2f(no_tiles_row * 100.0f, window.getSize().y - size_board.y + no_line * 100.0f)));
						no_tiles_row++;
						initialization_structure(temp, tiles_tex[tiles_tex.size() - 1].position_tile());
					}
					else if (temp == "006")
					{
						tiles_tex.push_back(Single_tile(window, &tex006, sf::Vector2f(no_tiles_row * 100.0f, window.getSize().y - size_board.y + no_line * 100.0f)));
						no_tiles_row++;
						initialization_structure(temp, tiles_tex[tiles_tex.size() - 1].position_tile());
					}
					else if (temp == "007")
					{
						tiles_tex.push_back(Single_tile(window, &tex007, sf::Vector2f(no_tiles_row * 100.0f, window.getSize().y - size_board.y + no_line * 100.0f)));
						no_tiles_row++;
						initialization_structure(temp, tiles_tex[tiles_tex.size() - 1].position_tile());
					}
					else if (temp == "008")
					{
						tiles_tex.push_back(Single_tile(window, &tex008, sf::Vector2f(no_tiles_row * 100.0f, window.getSize().y - size_board.y + no_line * 100.0f)));
						no_tiles_row++;
						initialization_structure(temp, tiles_tex[tiles_tex.size() - 1].position_tile());
					}
					else if (temp == "009")
					{
						tiles_tex.push_back(Single_tile(window, &tex009, sf::Vector2f(no_tiles_row * 100.0f, window.getSize().y - size_board.y + no_line * 100.0f)));
						no_tiles_row++;
						initialization_structure(temp, tiles_tex[tiles_tex.size() - 1].position_tile());
					}
					else if (temp == "010")
					{
						tiles_tex.push_back(Single_tile(window, &tex010, sf::Vector2f(no_tiles_row * 100.0f, window.getSize().y - size_board.y + no_line * 100.0f)));
						no_tiles_row++;
						initialization_structure(temp, tiles_tex[tiles_tex.size() - 1].position_tile());
					}
					else if (temp == "011")
					{
						tiles_tex.push_back(Single_tile(window, &tex011, sf::Vector2f(no_tiles_row * 100.0f, window.getSize().y - size_board.y + no_line * 100.0f)));
						no_tiles_row++;
						initialization_structure(temp, tiles_tex[tiles_tex.size() - 1].position_tile());
					}
					else if (temp == "012")
					{
						tiles_tex.push_back(Single_tile(window, &tex012, sf::Vector2f(no_tiles_row * 100.0f, window.getSize().y - size_board.y + no_line * 100.0f)));
						no_tiles_row++;
						initialization_structure(temp, tiles_tex[tiles_tex.size() - 1].position_tile());
					}
					else if (temp == "013")
					{
						tiles_tex.push_back(Single_tile(window, &tex013, sf::Vector2f(no_tiles_row * 100.0f, window.getSize().y - size_board.y + no_line * 100.0f)));
						no_tiles_row++;
					}
					else if (temp == "014")
					{
						tiles_tex.push_back(Single_tile(window, &tex014, sf::Vector2f(no_tiles_row * 100.0f, window.getSize().y - size_board.y + no_line * 100.0f)));
						no_tiles_row++;
					}
					else if (temp == "015")
					{
						tiles_tex.push_back(Single_tile(window, &tex015, sf::Vector2f(no_tiles_row * 100.0f, window.getSize().y - size_board.y + no_line * 100.0f)));
						no_tiles_row++;
						initialization_structure(temp, tiles_tex[tiles_tex.size() - 1].position_tile());
					}
					else if (temp == "016")
					{
						tiles_tex.push_back(Single_tile(window, &tex016, sf::Vector2f(no_tiles_row * 100.0f, window.getSize().y - size_board.y + no_line * 100.0f)));
						no_tiles_row++;
						initialization_structure(temp, tiles_tex[tiles_tex.size() - 1].position_tile());
					}
					else if (temp == "017")
					{
						tiles_tex.push_back(Single_tile(window, &tex017, sf::Vector2f(no_tiles_row * 100.0f, window.getSize().y - size_board.y + no_line * 100.0f)));
						no_tiles_row++;
						initialization_structure(temp, tiles_tex[tiles_tex.size() - 1].position_tile());
					}
					else if (temp == "018")
					{
						tiles_tex.push_back(Single_tile(window, &tex018, sf::Vector2f(no_tiles_row * 100.0f, window.getSize().y - size_board.y + no_line * 100.0f)));
						no_tiles_row++;
						initialization_structure(temp, tiles_tex[tiles_tex.size() - 1].position_tile());
					}
					else if (temp == "020")
					{
						tiles_tex.push_back(Single_tile(window, &tex020, sf::Vector2f(no_tiles_row * 100.0f, window.getSize().y - size_board.y + no_line * 100.0f)));
						no_tiles_row++;
					}
					else if (temp == "021")
					{
						tiles_tex.push_back(Single_tile(window, &tex021, sf::Vector2f(no_tiles_row * 100.0f, window.getSize().y - size_board.y + no_line * 100.0f)));
						no_tiles_row++;
					}
					else if (temp == "022")
					{
						tiles_tex.push_back(Single_tile(window, &tex022, sf::Vector2f(no_tiles_row * 100.0f, window.getSize().y - size_board.y + no_line * 100.0f)));
						no_tiles_row++;
					}
					else if (temp == "023")
					{
						tiles_tex.push_back(Single_tile(window, &tex023, sf::Vector2f(no_tiles_row * 100.0f, window.getSize().y - size_board.y + no_line * 100.0f)));
						no_tiles_row++;
					}
					else if (temp == "024")
					{
						tiles_tex.push_back(Single_tile(window, &tex024, sf::Vector2f(no_tiles_row * 100.0f, window.getSize().y - size_board.y + no_line * 100.0f)));
						no_tiles_row++;
					}
					else if (temp == "101")
					{
						tiles_tex.push_back(Single_tile(window, &tex101, sf::Vector2f(no_tiles_row * 100.0f, window.getSize().y - size_board.y + no_line * 100.0f)));
						no_tiles_row++;
					}
					else if (temp == "102")
					{
						tiles_tex.push_back(Single_tile(window, &tex102, sf::Vector2f(no_tiles_row * 100.0f, window.getSize().y - size_board.y + no_line * 100.0f)));
						no_tiles_row++;
					}
					else if (temp == "103")
					{
						tiles_tex.push_back(Single_tile(window, &tex103, sf::Vector2f(no_tiles_row * 100.0f, window.getSize().y - size_board.y + no_line * 100.0f)));
						no_tiles_row++;
					}
					else if (temp == "104")
					{
						tiles_tex.push_back(Single_tile(window, &tex104, sf::Vector2f(no_tiles_row * 100.0f, window.getSize().y - size_board.y + no_line * 100.0f)));
						no_tiles_row++;
					}
					else if (temp == "105")
					{
						tiles_tex.push_back(Single_tile(window, &tex105, sf::Vector2f(no_tiles_row * 100.0f, window.getSize().y - size_board.y + no_line * 100.0f)));
						no_tiles_row++;
					}
					else if (temp == "106")
					{
						tiles_tex.push_back(Single_tile(window, &tex106, sf::Vector2f(no_tiles_row * 100.0f, window.getSize().y - size_board.y + no_line * 100.0f)));
						no_tiles_row++;
					}
					else if (temp == "107")
					{
						tiles_tex.push_back(Single_tile(window, &tex107, sf::Vector2f(no_tiles_row * 100.0f, window.getSize().y - size_board.y + no_line * 100.0f)));
						no_tiles_row++;
					}
					else if (temp == "108")
					{
						tiles_tex.push_back(Single_tile(window, &tex108, sf::Vector2f(no_tiles_row * 100.0f, window.getSize().y - size_board.y + no_line * 100.0f)));
						no_tiles_row++;
					}
					i += 2;
				}
			}
		no_line++;
	}
	file.close();

}

sf::Sprite* Object_lvl_ini::shape(uint32_t index)
{
	return tiles_tex[index].shape_sprite();
}

void Object_lvl_ini::initialization_structure(std::string type, sf::Vector2i position_tile)
{
	struct_bonus_out.push_back(single_tile_out_for_bonus());
	struct_bonus_out[struct_bonus_out.size() - 1].id = struct_bonus_out.size();
	struct_bonus_out[struct_bonus_out.size() - 1].type = stoi(temp); //static_cast<int8_t>(temp);
	struct_bonus_out[struct_bonus_out.size() - 1].x_position = position_tile.x;
	struct_bonus_out[struct_bonus_out.size() - 1].y_position = position_tile.y;
}

uint16_t Object_lvl_ini::no_tiles()
{
	return tiles_tex.size();
}

single_tile_out_for_bonus Object_lvl_ini::tiles_setings_to_bonus(int16_t index)
{
	return struct_bonus_out[index];
}

void Object_lvl_ini::draw(sf::RenderWindow& window)
{
	for (auto i : tiles_tex)
		i.draw(window);
}

Od lini 249 zaczyna się funkcja która definiuje ta strukturę w vektorze

Chyba ta klasa powinna wystarczyć jak nie to dołączę inne ewentualnie dam linka do projektu na github GitHub
Test_lvl to klasa A
Object_lvl_ini to klasa B

Próbowałem już rady @adrian17 ale chyba coś robię źle

1
komentarz 1 października 2020 przez TOM_CPP Pasjonat (22,640 p.)

Funkcja

single_tile_out_for_bonus Object_lvl_ini::tiles_setings_to_bonus(int16_t index)
{
    return struct_bonus_out[index];
}

zwraca obiekt typu single_tile_out_for_bonus, który został zdefiniowany wewnątrz klasy Object_lvl_ini i nie jest widoczny na zewnątrz. (Stąd prawdopodobnie Twoje problemy)

Spróbuj poprawić definicję klasy single_tile_out_for_bonus na

struct single_tile_out_for_bonus
{
    int16_t id;
    int8_t type;
    int16_t x_position;
    int16_t y_position;
};

class Object_lvl_ini
{

public:
    Object_lvl_ini( sf::RenderWindow& window );

    uint8_t system(sf::RenderWindow& window);
    void create_objects(sf::RenderWindow& window, std::string path_lvl, sf::Vector2f size_board);
    sf::Sprite* shape(uint32_t index);
    void initialization_structure(std::string type, sf::Vector2i position_tile);
    uint16_t no_tiles();
    single_tile_out_for_bonus tiles_setings_to_bonus(int16_t index);
    void draw(sf::RenderWindow& window);

private:
    sf::Texture tex001, tex002, tex003, tex004, tex005, tex006, tex007, tex008, tex009, tex010, tex011, tex012, tex013, tex014, tex015,
        tex016, tex017, tex018, tex020, tex021, tex022, tex023, tex024, tex101, tex102, tex103, tex104, tex105, tex106, tex107, tex108, temp_tex;
    uint8_t no_line, no_tiles_row;

    std::vector<single_tile_out_for_bonus> struct_bonus_out;
    std::vector<Single_tile> tiles_tex;
    std::string line, temp;
};

 

komentarz 2 października 2020 przez nanautzin Obywatel (1,510 p.)
Tak dokładnie, to było problemem, dzięki

1 odpowiedź

+2 głosów
odpowiedź 29 września 2020 przez adrian17 Ekspert (344,860 p.)

pojedynczy element vectora (całą strukturę)?

Yup.

single_tile_out_for_bonus funkcja(int jakies_argumenty) {
    return jakis_vector[jakis_indeks];
}

 

komentarz 2 października 2020 przez nanautzin Obywatel (1,510 p.)

Twoje rozwiązanie + objaśnienie @TOM_CPP rozwiązało problem
Dzięki

Podobne pytania

+1 głos
0 odpowiedzi 81 wizyt
0 głosów
1 odpowiedź 216 wizyt
pytanie zadane 6 stycznia 2019 w C i C++ przez Sinnley Stary wyjadacz (12,810 p.)
0 głosów
1 odpowiedź 736 wizyt
pytanie zadane 5 maja 2019 w C i C++ przez abcd1234 Nowicjusz (140 p.)

92,551 zapytań

141,393 odpowiedzi

319,522 komentarzy

61,936 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...