OVH Cloud OVH Cloud

New et constructeur

7 réponses
Avatar
Jarod
Bonjour
Est ce que vous savez s'il y a moyen d'utiliser un constructeur autre que
celui par défaut en ayant fait de l'allocation dynamique sur un objet ?
Merci
Jarod

7 réponses

Avatar
Serge Paccalin
Le mardi 31 mai 2005 à 10:54, Jarod a écrit dans fr.comp.lang.c++ :

Est ce que vous savez s'il y a moyen d'utiliser un constructeur autre que
celui par défaut en ayant fait de l'allocation dynamique sur un objet ?


Pour un objet seul, oui :

class Point
{
public:
Point() : x(0), y(0) {} // ctr par défaut
Point(int a,int b) : x(a),y(b) {} // autre ctr

private:
int x,y;
};

...

Point *p = new Point(42,-5); // appelle autre ctr

...

delete p;

En revanche, pour un tableau...

Point *p2 = new Point[10]; // 10 x ctr par défaut

...

delete [] p2;

--
___________ 31/05/2005 12:32:45
_/ _ _`_`_`_) Serge PACCALIN -- sp ad mailclub.net
_L_) Il faut donc que les hommes commencent
-'(__) par n'être pas fanatiques pour mériter
_/___(_) la tolérance. -- Voltaire, 1763

Avatar
Sylvain Togni

En revanche, pour un tableau...


Pour un tableau aussi :

std::vector<Point> tableau;
tableau.reserve(2);
tableau.push_back(Point(42,-5));
tableau.push_back(Point(-5,42));

--
Sylvain Togni

Avatar
Pierre THIERRY
Le Tue, 31 May 2005 12:45:52 +0200, Sylvain Togni a écrit :
Pour un tableau aussi :

[...]
tableau.push_back(Point(-5,42));


Et si l'on veut faire appel à un autre constucteur que celui par défaut,
mais toujours le même, on a std::generate.

class Usine_A_Point
{
private:
int m_x, m_y;
public:
Usine_A_Point(int x, int y) : m_x(x), m_y(y) {}
Point operator ()() { return Point(m_x, m_y); }
};

vector<Point> tableau;
tableau.reserve(8);
generate(tableau.begin(), tableau.end(), Usine_A_Point(2,3));

Simplement,
Nowhere man
--

OpenPGP 0xD9D50D8A

Avatar
kanze
Pierre THIERRY wrote:
Pour un tableau aussi :

[...]
tableau.push_back(Point(-5,42));


Et si l'on veut faire appel à un autre constucteur que celui
par défaut, mais toujours le même, on a std::generate.

class Usine_A_Point
{
private:
int m_x, m_y;
public:
Usine_A_Point(int x, int y) : m_x(x), m_y(y) {}
Point operator ()() { return Point(m_x, m_y); }
};

vector<Point> tableau;
tableau.reserve(8);
generate(tableau.begin(), tableau.end(), Usine_A_Point(2,3));


Ce qui ne va pas faire grand chose. Plutôt :

std::generate_n( std::back_inserter( tableau ), 8, Usine_A_Point(
2, 3 ) ) ;

non ?

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Avatar
Sylvain Togni
Pierre THIERRY wrote:

Et si l'on veut faire appel à un autre constucteur que celui
par défaut, mais toujours le même, on a std::generate.



class Usine_A_Point
{
private:
int m_x, m_y;
public:
Usine_A_Point(int x, int y) : m_x(x), m_y(y) {}
Point operator ()() { return Point(m_x, m_y); }
};



vector<Point> tableau;
tableau.reserve(8);
generate(tableau.begin(), tableau.end(), Usine_A_Point(2,3));



Ce qui ne va pas faire grand chose. Plutôt :

std::generate_n( std::back_inserter( tableau ), 8, Usine_A_Point(
2, 3 ) ) ;

non ?


Moi je dirais plutôt :

std::vector<Point> tableau(8, Point(2,3));

tout simplement, non ?

--
Sylvain Togni


Avatar
kanze
Sylvain Togni wrote:
Pierre THIERRY wrote:

Et si l'on veut faire appel à un autre constucteur que celui
par défaut, mais toujours le même, on a std::generate.

class Usine_A_Point
{
private:
int m_x, m_y;
public:
Usine_A_Point(int x, int y) : m_x(x), m_y(y) {}
Point operator ()() { return Point(m_x, m_y); }
};

vector<Point> tableau;
tableau.reserve(8);
generate(tableau.begin(), tableau.end(), Usine_A_Point(2,3));


Ce qui ne va pas faire grand chose. Plutôt :

std::generate_n( std::back_inserter( tableau ), 8, Usine_A_Point(
2, 3 ) ) ;

non ?


Moi je dirais plutôt :

std::vector<Point> tableau(8, Point(2,3));

tout simplement, non ?


Dans ce cas précis, oui. Mais je crois que l'intention (d'après
les noms) était de pouvoir en générer des valeurs
différentes. Si Usine_A_Point est un objet fonctionnel, par
exemple, il pourrait incrément des valeurs à chaque fois.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34



Avatar
Pierre THIERRY
Le Tue, 31 May 2005 09:56:26 -0700, kanze a écrit :
generate(tableau.begin(), tableau.end(), Usine_A_Point(2,3));


Ce qui ne va pas faire grand chose.


Effectivement... Ecrit trop vite.

Brièvement,
Nowher eman
--

OpenPGP 0xD9D50D8A