Mais dans le cas suivant:
Mais dans le cas suivant:
Mais dans le cas suivant:
Bonsoir à tous,
voici mes 2 questions:
dans la partie: rendre son code const-correct, il parle de mettre
const toutes les fonctions qui ne modifient pas l'état visible de
l'objet. Qu'entend-il par là?
Je n'ai pas le livre sous la main, mais je me souviens de ce genre
d'exemple:
class foo
{
private:
int surface_;
public:
int GetSurface() const { return surface_; }
void toto()
{
if (mustCalcSurface)
surface_ = //blabla;
}
};
Et il recommandait de rendre toto() const et du coup surface_ mutable,
dans la mesure où toto() ne modifie pas l'état visible de l'objet.
Deuxième question:
il recommande d'utiliser l'idiome Create and Swap dans l'opérateur
d'affectation afin de le rendre "strongly exception safe", et
d'utiliser le constructeur par copie ainsi qu'une fonction Swap()
déclarée nothrow()
void Swa^p(Derived & other) throw()
{
std::swap(i_,??);
}
Bonsoir à tous,
voici mes 2 questions:
dans la partie: rendre son code const-correct, il parle de mettre
const toutes les fonctions qui ne modifient pas l'état visible de
l'objet. Qu'entend-il par là?
Je n'ai pas le livre sous la main, mais je me souviens de ce genre
d'exemple:
class foo
{
private:
int surface_;
public:
int GetSurface() const { return surface_; }
void toto()
{
if (mustCalcSurface)
surface_ = //blabla;
}
};
Et il recommandait de rendre toto() const et du coup surface_ mutable,
dans la mesure où toto() ne modifie pas l'état visible de l'objet.
Deuxième question:
il recommande d'utiliser l'idiome Create and Swap dans l'opérateur
d'affectation afin de le rendre "strongly exception safe", et
d'utiliser le constructeur par copie ainsi qu'une fonction Swap()
déclarée nothrow()
void Swa^p(Derived & other) throw()
{
std::swap(i_,??);
}
Bonsoir à tous,
voici mes 2 questions:
dans la partie: rendre son code const-correct, il parle de mettre
const toutes les fonctions qui ne modifient pas l'état visible de
l'objet. Qu'entend-il par là?
Je n'ai pas le livre sous la main, mais je me souviens de ce genre
d'exemple:
class foo
{
private:
int surface_;
public:
int GetSurface() const { return surface_; }
void toto()
{
if (mustCalcSurface)
surface_ = //blabla;
}
};
Et il recommandait de rendre toto() const et du coup surface_ mutable,
dans la mesure où toto() ne modifie pas l'état visible de l'objet.
Deuxième question:
il recommande d'utiliser l'idiome Create and Swap dans l'opérateur
d'affectation afin de le rendre "strongly exception safe", et
d'utiliser le constructeur par copie ainsi qu'une fonction Swap()
déclarée nothrow()
void Swa^p(Derived & other) throw()
{
std::swap(i_,??);
}
dans la partie: rendre son code const-correct, il parle de
mettre const toutes les fonctions qui ne modifient pas l'état
visible de l'objet. Qu'entend-il par là?
Je n'ai pas le livre sous la main, mais je me souviens de ce genre
d'exemple:
class foo
{
private:
int surface_;
public:
int GetSurface() const { return surface_; }
void toto()
{
if (mustCalcSurface)
surface_ = //blabla;
}
};
Et il recommandait de rendre toto() const et du coup surface_
mutable, dans la mesure où toto() ne modifie pas l'état
visible de l'objet.
Deuxième question:
il recommande d'utiliser l'idiome Create and Swap dans
l'opérateur d'affectation afin de le rendre "strongly
exception safe",
et d'utiliser le constructeur par copie ainsi qu'une fonction
Swap() déclarée nothrow()
Mais dans le cas suivant:
class Base
{
private:
int i_;
protected:
int GetI() { return i_; }
void Calc() = 0;
}
class Derived : public Base
{
public:
Derived(const Derived & other) : i_(?) {}
Derived & operator=(const Derived & other)
{
Derived temp(other);
Swap(temp);
return *this;
}
void Swap(Derived & other) throw()
{
std::swap(i_,??);
}
dans la partie: rendre son code const-correct, il parle de
mettre const toutes les fonctions qui ne modifient pas l'état
visible de l'objet. Qu'entend-il par là?
Je n'ai pas le livre sous la main, mais je me souviens de ce genre
d'exemple:
class foo
{
private:
int surface_;
public:
int GetSurface() const { return surface_; }
void toto()
{
if (mustCalcSurface)
surface_ = //blabla;
}
};
Et il recommandait de rendre toto() const et du coup surface_
mutable, dans la mesure où toto() ne modifie pas l'état
visible de l'objet.
Deuxième question:
il recommande d'utiliser l'idiome Create and Swap dans
l'opérateur d'affectation afin de le rendre "strongly
exception safe",
et d'utiliser le constructeur par copie ainsi qu'une fonction
Swap() déclarée nothrow()
Mais dans le cas suivant:
class Base
{
private:
int i_;
protected:
int GetI() { return i_; }
void Calc() = 0;
}
class Derived : public Base
{
public:
Derived(const Derived & other) : i_(?) {}
Derived & operator=(const Derived & other)
{
Derived temp(other);
Swap(temp);
return *this;
}
void Swap(Derived & other) throw()
{
std::swap(i_,??);
}
dans la partie: rendre son code const-correct, il parle de
mettre const toutes les fonctions qui ne modifient pas l'état
visible de l'objet. Qu'entend-il par là?
Je n'ai pas le livre sous la main, mais je me souviens de ce genre
d'exemple:
class foo
{
private:
int surface_;
public:
int GetSurface() const { return surface_; }
void toto()
{
if (mustCalcSurface)
surface_ = //blabla;
}
};
Et il recommandait de rendre toto() const et du coup surface_
mutable, dans la mesure où toto() ne modifie pas l'état
visible de l'objet.
Deuxième question:
il recommande d'utiliser l'idiome Create and Swap dans
l'opérateur d'affectation afin de le rendre "strongly
exception safe",
et d'utiliser le constructeur par copie ainsi qu'une fonction
Swap() déclarée nothrow()
Mais dans le cas suivant:
class Base
{
private:
int i_;
protected:
int GetI() { return i_; }
void Calc() = 0;
}
class Derived : public Base
{
public:
Derived(const Derived & other) : i_(?) {}
Derived & operator=(const Derived & other)
{
Derived temp(other);
Swap(temp);
return *this;
}
void Swap(Derived & other) throw()
{
std::swap(i_,??);
}
Mais dans le cas suivant:
Dans ce cas, les constructeur et opérateur de copie par défaut
conviennent parfaitement.
L'idiome "swap" ne sert que quand les constructeur et opérateur de
copie par défaut ne conviennent pas -- typiquement, quand un membre
est un pointeur.
Mais dans le cas suivant:
Dans ce cas, les constructeur et opérateur de copie par défaut
conviennent parfaitement.
L'idiome "swap" ne sert que quand les constructeur et opérateur de
copie par défaut ne conviennent pas -- typiquement, quand un membre
est un pointeur.
Mais dans le cas suivant:
Dans ce cas, les constructeur et opérateur de copie par défaut
conviennent parfaitement.
L'idiome "swap" ne sert que quand les constructeur et opérateur de
copie par défaut ne conviennent pas -- typiquement, quand un membre
est un pointeur.
Ca s'applique le cas ou une opération peut lancer une exception ce qui
n'est pas le cas dans ton exemple.void Swa^p(Derived & other) throw()
{
std::swap(i_,??);
}
Le but est justement que l'opération de swap soit nothrow donc pas
d'indication throw().
Ca s'applique le cas ou une opération peut lancer une exception ce qui
n'est pas le cas dans ton exemple.
void Swa^p(Derived & other) throw()
{
std::swap(i_,??);
}
Le but est justement que l'opération de swap soit nothrow donc pas
d'indication throw().
Ca s'applique le cas ou une opération peut lancer une exception ce qui
n'est pas le cas dans ton exemple.void Swa^p(Derived & other) throw()
{
std::swap(i_,??);
}
Le but est justement que l'opération de swap soit nothrow donc pas
d'indication throw().
il recommande d'utiliser l'idiome Create and Swap dans
l'opérateur d'affectation afin de le rendre "strongly
exception safe",
Je me démande s'il dirait encore la même chose aujourd'hui.
C'est une façon de rendre "strongly exception safe", mais ce
n'est pas la seule façon, et on constate depuis qu'il a écrit le
livre qu'on n'a pas vraiment besoin de "strongly exception safe"
aussi souvent que ça. (Mais c'est toujours un idiome à
connaître. C'est parfois la façon la plus simple et la plus sûr
de rendre "strongly exception safe", si on en a besoin.)
L'idiome de swap ne s'applique que si tous les membres et les
bases possèdent une fonction de swap nothrow. Dans ce cas-ci,
par exemple, on ne pourrait s'en servir que si Base avait
elle-meme un swap(), c-à-d :
class Base
{
private:
int i ;
public:
// ...
void swap( Base& other ) throw()
{
std::swap( i, other.i ) ;
}
Base& operator=( Base const& other )
{
Base tmp( other ) ;
swap( tmp ) ;
return *this ;
}
} ;
class Derived : public Base
{
public:
void swap( Derived& other ) throw()
{
Base::swap( other ) ;
// ...
}
Derived& operator=( Derived const& other )
{
Derived tmp( other ) ;
swap( tmp ) ;
return *this ;
}
} ;
(Évidemment, il ne s'applique pas à des classes aussi simple. Il
ne se justifie en fait que s'il y a des affectations des
sous-objets qui pourrait autrement échouer, à cause d'une
allocation dynamique, par exemple. Et aussi, c'est très, très
rare que des classes dans une hièrarchie polymorphique
supportent l'affectation, et quand elles le font, on se sert de
l'idiome de lettre/envéloppe, qui a d'autres contraintes, et ce
n'est que la classe de base qui supporte l'affectation, pas les
classes dérivées. Mais exactement les mêmes considérations
s'appliquent aux classes avec des membres plus ou moins
compliqués.)
il recommande d'utiliser l'idiome Create and Swap dans
l'opérateur d'affectation afin de le rendre "strongly
exception safe",
Je me démande s'il dirait encore la même chose aujourd'hui.
C'est une façon de rendre "strongly exception safe", mais ce
n'est pas la seule façon, et on constate depuis qu'il a écrit le
livre qu'on n'a pas vraiment besoin de "strongly exception safe"
aussi souvent que ça. (Mais c'est toujours un idiome à
connaître. C'est parfois la façon la plus simple et la plus sûr
de rendre "strongly exception safe", si on en a besoin.)
L'idiome de swap ne s'applique que si tous les membres et les
bases possèdent une fonction de swap nothrow. Dans ce cas-ci,
par exemple, on ne pourrait s'en servir que si Base avait
elle-meme un swap(), c-à-d :
class Base
{
private:
int i ;
public:
// ...
void swap( Base& other ) throw()
{
std::swap( i, other.i ) ;
}
Base& operator=( Base const& other )
{
Base tmp( other ) ;
swap( tmp ) ;
return *this ;
}
} ;
class Derived : public Base
{
public:
void swap( Derived& other ) throw()
{
Base::swap( other ) ;
// ...
}
Derived& operator=( Derived const& other )
{
Derived tmp( other ) ;
swap( tmp ) ;
return *this ;
}
} ;
(Évidemment, il ne s'applique pas à des classes aussi simple. Il
ne se justifie en fait que s'il y a des affectations des
sous-objets qui pourrait autrement échouer, à cause d'une
allocation dynamique, par exemple. Et aussi, c'est très, très
rare que des classes dans une hièrarchie polymorphique
supportent l'affectation, et quand elles le font, on se sert de
l'idiome de lettre/envéloppe, qui a d'autres contraintes, et ce
n'est que la classe de base qui supporte l'affectation, pas les
classes dérivées. Mais exactement les mêmes considérations
s'appliquent aux classes avec des membres plus ou moins
compliqués.)
il recommande d'utiliser l'idiome Create and Swap dans
l'opérateur d'affectation afin de le rendre "strongly
exception safe",
Je me démande s'il dirait encore la même chose aujourd'hui.
C'est une façon de rendre "strongly exception safe", mais ce
n'est pas la seule façon, et on constate depuis qu'il a écrit le
livre qu'on n'a pas vraiment besoin de "strongly exception safe"
aussi souvent que ça. (Mais c'est toujours un idiome à
connaître. C'est parfois la façon la plus simple et la plus sûr
de rendre "strongly exception safe", si on en a besoin.)
L'idiome de swap ne s'applique que si tous les membres et les
bases possèdent une fonction de swap nothrow. Dans ce cas-ci,
par exemple, on ne pourrait s'en servir que si Base avait
elle-meme un swap(), c-à-d :
class Base
{
private:
int i ;
public:
// ...
void swap( Base& other ) throw()
{
std::swap( i, other.i ) ;
}
Base& operator=( Base const& other )
{
Base tmp( other ) ;
swap( tmp ) ;
return *this ;
}
} ;
class Derived : public Base
{
public:
void swap( Derived& other ) throw()
{
Base::swap( other ) ;
// ...
}
Derived& operator=( Derived const& other )
{
Derived tmp( other ) ;
swap( tmp ) ;
return *this ;
}
} ;
(Évidemment, il ne s'applique pas à des classes aussi simple. Il
ne se justifie en fait que s'il y a des affectations des
sous-objets qui pourrait autrement échouer, à cause d'une
allocation dynamique, par exemple. Et aussi, c'est très, très
rare que des classes dans une hièrarchie polymorphique
supportent l'affectation, et quand elles le font, on se sert de
l'idiome de lettre/envéloppe, qui a d'autres contraintes, et ce
n'est que la classe de base qui supporte l'affectation, pas les
classes dérivées. Mais exactement les mêmes considérations
s'appliquent aux classes avec des membres plus ou moins
compliqués.)
void Swa^p(Derived & other) throw()
Le but est justement que l'opération de swap soit nothrow donc pas
d'indication throw().
void Swa^p(Derived & other) throw()
Le but est justement que l'opération de swap soit nothrow donc pas
d'indication throw().
void Swa^p(Derived & other) throw()
Le but est justement que l'opération de swap soit nothrow donc pas
d'indication throw().
il recommande d'utiliser l'idiome Create and Swap dans
l'opérateur d'affectation afin de le rendre "strongly
exception safe",
Je me démande s'il dirait encore la même chose aujourd'hui.
C'est une façon de rendre "strongly exception safe", mais ce
n'est pas la seule façon, et on constate depuis qu'il a écrit le
livre qu'on n'a pas vraiment besoin de "strongly exception safe"
aussi souvent que ça. (Mais c'est toujours un idiome à
connaître. C'est parfois la façon la plus simple et la plus sûr
de rendre "strongly exception safe", si on en a besoin.)
Quelles autres méthodes existe-il alors?
Qu'est-ce que tu entends par "pas aussi souvent que ça"?
J'imagine que les allocations / Déallocations se doivent de
l'être, non?
Qu'est-ce que cet idiome de lettre / enveloppe?
il recommande d'utiliser l'idiome Create and Swap dans
l'opérateur d'affectation afin de le rendre "strongly
exception safe",
Je me démande s'il dirait encore la même chose aujourd'hui.
C'est une façon de rendre "strongly exception safe", mais ce
n'est pas la seule façon, et on constate depuis qu'il a écrit le
livre qu'on n'a pas vraiment besoin de "strongly exception safe"
aussi souvent que ça. (Mais c'est toujours un idiome à
connaître. C'est parfois la façon la plus simple et la plus sûr
de rendre "strongly exception safe", si on en a besoin.)
Quelles autres méthodes existe-il alors?
Qu'est-ce que tu entends par "pas aussi souvent que ça"?
J'imagine que les allocations / Déallocations se doivent de
l'être, non?
Qu'est-ce que cet idiome de lettre / enveloppe?
il recommande d'utiliser l'idiome Create and Swap dans
l'opérateur d'affectation afin de le rendre "strongly
exception safe",
Je me démande s'il dirait encore la même chose aujourd'hui.
C'est une façon de rendre "strongly exception safe", mais ce
n'est pas la seule façon, et on constate depuis qu'il a écrit le
livre qu'on n'a pas vraiment besoin de "strongly exception safe"
aussi souvent que ça. (Mais c'est toujours un idiome à
connaître. C'est parfois la façon la plus simple et la plus sûr
de rendre "strongly exception safe", si on en a besoin.)
Quelles autres méthodes existe-il alors?
Qu'est-ce que tu entends par "pas aussi souvent que ça"?
J'imagine que les allocations / Déallocations se doivent de
l'être, non?
Qu'est-ce que cet idiome de lettre / enveloppe?