Partage
  • Partager sur Facebook
  • Partager sur Twitter

Création de liste d'objets

Vecteurs ou tableaux ?

1 septembre 2018 à 15:00:54

Bonjour,

Je cherche à créer une liste de point.

Voilà mon code :

main.cpp

#include <iostream>
#include <vector>
#include "Point.hpp"

int main()
{	
	//Creation of a vector of Points
	std::vector<Point> table;

		table.push_back(Point ());
		table.push_back(Point ());

	//Iterating over the vector
	for(Point p: table)
	{
		std::cout << " >> Object found" << std::endl;
	}

	return 0;
}

Point.cpp

#include <iostream>
#include "Point.hpp"

int Point::p = 1;

Point::Point()
{
	this->num_point = p; 
	p++;

	std::cout << "Point number : " << this->num_point << " created " << std::endl;

}

Point::~Point()
{
	std::cout << "Point number : " << this->num_point << " destroyed" << std::endl;
}

Point.hpp

#ifndef POINT
#define POINT

class Point
{
	static int p;

	public:

		Point();
		~Point();
	
	private:
		int num_point;
};

#endif

J'ai donc opté pour la création via un vecteur.

Cependant voici ce que j'obtiens avec la création de deux points :

Point number : 1 created 
Point number : 1 destroyed
Point number : 2 created 
Point number : 1 destroyed
Point number : 2 destroyed
 >> Object found
Point number : 1 destroyed
 >> Object found
Point number : 2 destroyed
Point number : 1 destroyed
Point number : 2 destroyed

Je ne comprends pas pourquoi j'ai plusieurs créations et destructions d'objets alors que je devrais n'en avoir que deux pour chaque.

De même faut il utiliser un tableau à la place d'un vecteur ?

Pourriez-vous m'éclairer sur le sujet ?

Merci d'avance

  • Partager sur Facebook
  • Partager sur Twitter

Développeur Web autodidacte HTML5/CSS3/JS + C# (ASP.NET Core) / Python (Django)

1 septembre 2018 à 15:20:50

Salut !

Cela s'explique par le fait que tu appelles des constructeur par copie / constructeur par déplacement implicitement créé par le compilateur :)

  • Partager sur Facebook
  • Partager sur Twitter
http://cpp-rendering.io : Vous trouverez tout ce dont vous avez besoin sur Vulkan / OpenGL et le rendu 3D !
1 septembre 2018 à 22:51:48

Tu as bien créé 7 Points, les 7 destructions sont tracées mais des constructeurs de copies et de déplacement ont été appelés en plus du constructeur par défaut que tu as créé.
Ligne 10, tu créés un Point (ctor par défaut que l'on voit dans la trace), mais le push_back doit créer un Point dans le vector (ctor par déplacement de ton Point).
Ligne 11, il y a 3 créations de Points. Celui explicite, celui du push_back et comme le vector a du grandir un ctor de déplacement peut être nécessaire.
Ligne 16, a chaque itération il faut obtenir un Point p qui doit être construit par le ctor de copie, d'où 2 de plus.
Il y a bien 7 créations.

On peut écrire ce code de manière à ce que seuls les 2 Points nécessaires soient créés.

    std::vector<Point> table;
    table.reserve(2);      // on prévoit 2 Points dans table
 
    table.emplace_back();  // création directe dans table d'un Point
    table.emplace_back();
 
    for ( Point const& p : table ) { // on référence les Point dans table
        std::cout << " >> Object found" << std::endl;
    }

-
Edité par Dalfab 1 septembre 2018 à 22:53:31

  • Partager sur Facebook
  • Partager sur Twitter

En recherche d'emploi.