• 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

VPS Starter Arubacloud
0 głosów
430 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,100 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 80 wizyt
0 głosów
1 odpowiedź 215 wizyt
pytanie zadane 6 stycznia 2019 w C i C++ przez Sinnley Stary wyjadacz (12,810 p.)
0 głosów
1 odpowiedź 723 wizyt
pytanie zadane 5 maja 2019 w C i C++ przez abcd1234 Nowicjusz (140 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...