• 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

Fiszki IT
Fiszki IT
0 głosów
83 wizyt
pytanie zadane 29 września 2020 w C i C++ przez nanautzin Użytkownik (890 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,750 p.)
Co dokładnie chcesz zrobić?
komentarz 29 września 2020 przez TOM_CPP Pasjonat (17,820 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 Użytkownik (890 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 (17,820 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,750 p.)

Śmierdzi mi XY problem

komentarz 1 października 2020 przez nanautzin Użytkownik (890 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 (17,820 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 Użytkownik (890 p.)
Tak dokładnie, to było problemem, dzięki

1 odpowiedź

+2 głosów
odpowiedź 29 września 2020 przez adrian17 Ekspert (297,380 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 Użytkownik (890 p.)

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

Podobne pytania

+1 głos
0 odpowiedzi 55 wizyt
0 głosów
1 odpowiedź 59 wizyt
pytanie zadane 6 stycznia 2019 w C i C++ przez Sinnley Stary wyjadacz (12,740 p.)
0 głosów
1 odpowiedź 177 wizyt
pytanie zadane 5 maja 2019 w C i C++ przez abcd1234 Nowicjusz (140 p.)
Porady nie od parady
Komentarze do pytań nie służą do odpowiadania, od tego jest wydzielona sekcja odpowiedzi. Funkcją komentarzy jest natomiast możliwość uzyskania dodatkowych informacji na temat samego posta.Komentarze

84,744 zapytań

133,547 odpowiedzi

295,964 komentarzy

56,007 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...