SFML community forums

Help => General => Topic started by: Blingu on November 06, 2018, 03:23:19 pm

Title: Adding shapes to vector
Post by: Blingu on November 06, 2018, 03:23:19 pm
Hi, I want to make a class with a vector inside that storages shapes for me (e.g. a rectangle, circle). I know that sf::RectangleShape's and sf::CircleShape's base class is sf::Shape, so I made a class like that (includes are irrelevant here, they are fine):
//header file
class ObjectStorage
{
private:
        std::vector <std::shared_ptr<sf::Shape>>sequence;

public:
         ObjectStorage();
         void add(std::shared_ptr<sf::Shape> const &ob);
         void show();
};
//cpp file
void ObjectStorage::add(std::shared_ptr<sf::Shape> const &ob)
{
        sequence.push_back(ob);
}

As you can see whenever I want to call the method add with a rectangle or circle shape called test1 I do it like that (objectstorage is a pointer that is initialized with the ObjectStorage constructor, no problems with it as well):

objectstorage->add(test1);

Although it gives me this compiler error "no suitable user-defined conversion from "sf::RectangleShape" to "const std::shared_ptr<sf::Shape>" exists".
How can I store rectangle, convex and circle shapes in a single vector?
Title: Re: Adding shapes to vector
Post by: Tigre Pablito on November 07, 2018, 03:19:39 am
Hi,

I'm sure that it works with an array, but I'm not sure if it works with a vector (List<T> in C#)

i.e. (in C#)

Parent[] array = new Parent[] { new Child1(), new Child2(), new Child1(), new Child4() };

Or maybe if you don't make the generic type "const" ... ?  ::)

........

What has happened with your Arkanoid clone project? Remember that Hapax and i tried to help you?  ;D
(sorry for the out of topic)
Title: Re: Adding shapes to vector
Post by: Blingu on November 07, 2018, 04:49:37 pm
Hi,

I'm sure that it works with an array, but I'm not sure if it works with a vector (List<T> in C#)

i.e. (in C#)

Parent[] array = new Parent[] { new Child1(), new Child2(), new Child1(), new Child4() };

Or maybe if you don't make the generic type "const" ... ?  ::)

........

What has happened with your Arkanoid clone project? Remember that Hapax and i tried to help you?  ;D
(sorry for the out of topic)

I abandoned it for now due to the issue I still couldn't solve. Maybe I'll just use a sprite with rounded edges like another project does where this issue doesn't appear.

I'll try to implement your suggestion to my code and gonna see if it works.
Title: Re: Adding shapes to vector
Post by: Blingu on November 07, 2018, 05:05:27 pm
I don't really know how to do that, nor how to operate with an array like this afterwards. Somebody got an idea how to do it with vectors?  :-\

Or can somebody explain me what is the problem with my stuff above?
Title: Re: Adding shapes to vector
Post by: Laurent on November 07, 2018, 07:36:01 pm
The error message is pretty clear, a sf::Rectangle is not a std::shared_ptr<sf::Shape>, and is not convertible to it.

If you want to store non-owning pointers, then use std::vector<sf::Shape*>. If you want your vector to own the shapes, use a std::vector<std::unique_ptr<sf::Shape>>. How to properly use each solution is pure C++ stuff, that you can learn outside this SFML forum ;)