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

Jak stworzyć iterator dla własnej klasy

Konkurs Mistrz Programowania
0 głosów
1,996 wizyt
pytanie zadane 17 kwietnia 2018 w C i C++ przez Asokus Początkujący (450 p.)
zmienione kategorie 17 kwietnia 2018 przez ScriptyChris

Witam, wiecie co zrobić żeby iterator kontenera, listy konkretnie działał dla listy której składnikami są obiekty klasy Point? Dodam że używam w projekcie sfml stąd metody niezwiązane z pytaniem.

Point.h

#pragma once
#include <SFML/Graphics.hpp>

using namespace sf;

class Point :public sf::Drawable
{
public:
	Point(float x, float y);
	~Point() = default;
	friend class Map;
private:
	CircleShape object;
	float radius{ 5 };
	Color color{ 255, 0, 0 };
	void draw(RenderTarget& target, RenderStates state) const override;
};

Point.cpp

#include "stdafx.h"
#include "Point.h"


Point::Point(float x, float y)
{
	object.setFillColor(color);
	object.setRadius(radius);
	object.setOrigin(radius, radius);
	object.setPosition(x, y);
}

void Point::draw(RenderTarget & target, RenderStates state) const
{
	target.draw(this->object, state);
}

plik.h klasy w której tworzę listę punktów 

Map.h

#pragma once
#include <SFML/Graphics.hpp>
#include "Point.h"
#include <list>

using namespace sf;
using namespace std;

class Map :public sf::Drawable
{
public:
	Map();
	~Map() = default;
	friend class Guardian;
private:
	const int mapSizeX{ 64 };
	const int mapSizeY{ 48 };
	const int squerSize{ 12 };
	int wallMap[48][64];
	list<Point> pointList;
	list<Point>::iterator it;

	Texture wallTexture, emptyTexture;
	void draw(RenderTarget& target, RenderStates state) const override;
	void addPoint(float x, float y);
	void deletePoint(float x, float y);
};

Fragment Map.cpp (funkcja w której obrazuję problem)

void Map::draw(RenderTarget & target, RenderStates state) const
{
       for (it = pointList.begin(); it != pointList.end(); ++it) //rysowanie punktów
	{

	}
}

żaden operator nie pasuje do tych argumentów. Wiecie jak stworzyć taki operator ("=" i "++") prawidłowo i w którym miejscu. A może to nie o to chodzi? dodam, że jeżeli listę zainicjuję w środku funkcji to wtedy kompilator nie widzi tego problemu ale lista staje się bezużyteczna, poniżej ta sytuacja.

	list<Point> pointList;
	list<Point>::iterator it;
	for (it = pointList.begin(); it != pointList.end(); ++it) //rysowanie punktów
	{

	}

Dziękuję z góry za pomoc.

komentarz 17 kwietnia 2018 przez Mateusz Tocha Bywalec (2,560 p.)

W twoim przykłądzie masz typ prosty, a nie kontener STL który przeciąża operator "="  i wymaga  jawnie jest to napisane u mnie w konsoli CMake 3.10.

 

error: no match for 'operator=' (operand types are 'std::list<Point>::iterator {aka std::_List_iterator<Point>}' and 'std::list<Point>::const_iterator {aka std::_List_const_iterator<Point>}')
[build]          for (this->it = this->pointList.begin(); this->it != this->pointList.end(); this->it++)
[build]                         

 

kiedy usunę const_iterator a zostawie mutable

 

komentarz 17 kwietnia 2018 przez mokrowski Mędrzec (158,940 p.)
No przecież masz std::vector ? Chyba że nie zrozumiałem pytania..
komentarz 17 kwietnia 2018 przez Mateusz Tocha Bywalec (2,560 p.)

He he sprytnie to obszedłes ;) Dzieki za przykład

 X(): a{}, vec{1,2,3,4} {
        it = vec.begin();
    }

ale jakbyś tak it zadeklarować chciał w metodzie incementValues() :)  to już się nie da ale ty o tym widziałeś :> tylko jeżeli tę funkcje draw będzie używał to będzie musiał reinicjalizować ten iterator na zewnątrz tej funkcji. Sam nie wiem co jest wygodnieszjesz.

 

komentarz 17 kwietnia 2018 przez mokrowski Mędrzec (158,940 p.)
Oczywiście... bo jak pisałem mutable będzie oznaczało że da się "przestawić" ale nie że da się "nadpisać" i że nie da "mu się danych zmienić jeśli nie jest const"... dobrze na dziś koniec bo jestem już nieco zmęczony w projekcie więc jeśli coś jest niejasne ... do jutra..
komentarz 17 kwietnia 2018 przez Mateusz Tocha Bywalec (2,560 p.)
Spoko po prostu miałem na uwadzę tę metodę Draw()  będzie jednak reinicjalizować iterator w GameLoopie no chyba żę zrobi zewnętrznie Map->RefreshIterator() czy coś takiego.

 

No nic zawsze to się czegoś można dowiedzieć pozdrawiam

2 odpowiedzi

0 głosów
odpowiedź 17 kwietnia 2018 przez Mateusz Tocha Bywalec (2,560 p.)

adrian17  coś to zmienia? (sam się uczę pytam z ciekawości)

 

#include <iostream>
#include <list>

class Point
{
  public:
    double x, y;
};

class Map
{
  public:
    std::list<Point> pointList;
    std::list<Point>::iterator it;

    void Draw()
    {
        for (this->it = this->pointList.begin(); this->it != this->pointList.end(); this->it++)
        {
            std::cout<<this->it->x<<" "<<this->it->y<<std::endl;
        }
    }
};

int main()
{

    Map map;

    Point tempPoint;
    tempPoint.x = 1;
    tempPoint.y = 2;
    map.pointList.emplace_back(tempPoint);
    tempPoint.x = 3;
    tempPoint.y = 4;
    map.pointList.emplace_back(tempPoint);

    map.Draw();

    std::cin.get();

    return 0;
}

 

komentarz 17 kwietnia 2018 przez adrian17 Mentor (354,880 p.)
Słabo rozumiem, jak zbitka kodu odpowiada na pytanie/problem autora pytania. Stąd pewnie również downvote'y w drugiej "odpowiedzi".

Nie wiem też, o co Ty pytasz teraz :/
komentarz 17 kwietnia 2018 przez Mateusz Tocha Bywalec (2,560 p.)

ale faktycznie jak zrobie z tej funkcji "getter" i dopisze const na końcu  to rzuca błedem

[build] ../main.cpp:18:47: error: no match for 'operator=' (operand types are 'const iterator {aka const std::_List_iterator<Point>}' and 'std::list<Point>::const_iterator {aka std::_List_const_iterator<Point>}')
[build]          for (this->it = this->pointList.begin(); this->it != this->pointList.end(); this->it++)
[build]                             

 

komentarz 17 kwietnia 2018 przez Mateusz Tocha Bywalec (2,560 p.)

@adrian17, Sorry nie zauwżyłem istoty problemu, że ten const tam się schował za mtodą, stąd moje zdziwienie że iterator nie działa jak wykorzystuje się go jako pole w klasie.

Teraz wszystko jasne
–2 głosów
odpowiedź 17 kwietnia 2018 przez Mateusz Tocha Bywalec (2,560 p.)
#include <iostream>
#include <list>

class Point
{
  public:
    double x, y;
};

int main()
{
    std::list<Point> pointList;
    Point tempPoint;
    tempPoint.x = 1;
    tempPoint.y = 2;

    pointList.emplace_back(tempPoint);

    Point tempPoint2;
    tempPoint2.x = 3;
    tempPoint2.y = 4;

    pointList.emplace_back(tempPoint2);

    for (auto &point_it : pointList)
    {
        std::cout <<"X:"<< point_it.x << "  Y: "<<point_it.y<<std::endl;
    }

    //LUB

    for(Point& point_it:pointList){
        std::cout <<"X:"<< point_it.x << "  Y: "<<point_it.y<<std::endl;
    }

    //LUB

    for(std::list<Point>::iterator it=pointList.begin(); it!=pointList.end(); it++){
         std::cout <<"X:"<< it->x << "  Y: "<<it->y<<std::endl;
    }

    std::cin.get();

    return 0;
}

 

Podobne pytania

0 głosów
0 odpowiedzi 357 wizyt
pytanie zadane 24 listopada 2020 w C i C++ przez maks0410 Początkujący (290 p.)
–20 głosów
1 odpowiedź 1,949 wizyt

93,656 zapytań

142,577 odpowiedzi

323,100 komentarzy

63,174 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

Kursy INF.02 i INF.03
...