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 31 32 33 34 35 36
| #include <iostream>
class Object {};
class Bidule {
public:
void organize(Object const * const * Object_packet) {
std::cout << "Appel à Bidule::organize\n";
}
};
const size_t cBOX_SIZE = 9;
// Dans un gros programme, le c minuscule ici servirait à éviter une collision avec un nom de macro,
// dans le cas où quelqu'un aurait déjà défini quelque part une macro BOX_SIZE sans qu'on ne l'ait remarquée.
// Par convention, les noms des macros sont entièrement en majuscules.
int main()
{
Object box[cBOX_SIZE]; // tableau de cBOX_SIZE objects
// Cette instruction alloue cBOX_SIZE*sizeof(Object) bytes dans la pile et appelle cBOX_SIZE fois le constructeur par défaut de Object.
// Allouer dans la pile est plus performant qu'allouer dans la mémoire dynamique avec new.
// En plus, cela permet de ne pas devoir appeler delete : les objets seront détruits quand on sortira de la portée de la variable automatique box.
Object const* packet[cBOX_SIZE+1];
for(size_t k = 0; k < cBOX_SIZE; ++k)
packet[k] = &box[k]; // Remarque : autre écriture : packet[k] = box + k;
packet[cBOX_SIZE] = NULL; // Remarque : en C++11, il sera préférable de remplacer NULL par nullptr.
Object const* const* packetAsPtr = packet;
// organize(packetAsPtr); // Ne compile pas. Comme l'a dit ternel : on ne peut pas appeler une fonction membre sans objet.
Bidule bidule;
bidule.organize(packetAsPtr); // Compile.
return 0;
} |