Moi ce que je trouve dommage avec les conteneurs, c'est qu'il n'y a pas de distinction entre le conteneur et le contenu:
ce code ne compile pas
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
#include <vector>
#include <algorithm>
#include <iostream>
class A
{
private:
std::vector<int> m_vect;
public:
A(std::vector<int> const& init) : m_vect(init) {}
std::vector<int> const& f() const throw() { return m_vect; }
};
int main(void)
{
int i = 0;
std::vector<int> l_vect(10);
for (i=0; i<10; ++i)
l_vect[i] = i;
A a(l_vect);
a.f().front() = 0;
return 0;
} |
alors que c'est le conteneur que je souhaiterai constant et non son contenu (donc par exemple, pas de possibilité de faire des push_back mais par contre pouvoir modifier ses éléments). Il faut donc passer par le code suivant:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
#include <vector>
#include <algorithm>
#include <iostream>
class B
{
private:
std::vector<int*> m_vect;
public:
B(std::vector<int*> const& init) : m_vect(init) {}
std::vector<int*> const& f() const throw() { return m_vect; }
};
int main(void)
{
int i = 0;
std::vector<int*> l_vect(10);
for (i=0; i<10; ++i)
l_vect[i] = new int(i);
B b(l_vect);
*(b.f().front()) = 100;
std::cout << *(l_vect[0]) << std::endl;
return 0;
} |
Cette fois-ci ça compile. J'avais cependant lu il me semble sur ce forum que cela allait évoluer avec la nouvelle norme qui impliquerait alors que les vecteurs de pointeurs constant interdirait alors la modification des éléments pointés (j'espère que ce ne sera pas le cas car il y aura alors complète assimilation entre le conteneur et le contenu qui sont pourtant deux concepts différents)