Questions d'un "mannequin - page 139

 
220Volt:
Ouais, je suppose que je devrais lui donner un signe plus...)
Bonne illustration de l'inutilité de la question "pourquoi ?". Peut-être y a-t-il d'autres questions ? :)
 
MetaDriver:
Bonne illustration de l'inutilité de la question " pourquoi ? ", peut-être y a-t-il d'autres questions ? :)
:) Voici une idée - peut-être y a-t-il un autre moyen de le faire dans VS ? Ou est-ce inutile ?
 
220Volt:
:) Une idée - existe-t-il un autre moyen de le faire dans VS ? Ou est-ce inutile ?
C'est la bonne question, et une question utile. Maintenant les experts peuvent vous donner une réponse significative... :)
 
220Volt:
:) J'ai une idée - peut-être que les VS devraient avoir une façon différente de faire les choses ?
oui.
 
//--------- C++
class cl2; 

class cl1
{
public:
        int q;
        void fn2(cl2 &t);
};

class cl2
{
public:
        int i;
        void fn(cl1 &w);
};
//-- реализация функций только после полного описания интерфейса - т.е. фиксации размеров классов
//-- теперь компилятор знает сколько именно стека нужно резервировать в функциях под классы
void cl1::fn2(cl2 &t){t.i = 87;}
void cl2::fn(cl1 &w){w.q = 9;}

 
sergeev:
Oui.
Eh bien, tout le monde peut le faire... vous faites fonctionner les variables de référence... :) :)
 
MetaDriver:

Et voilà, le plus un s'en va :). Merci.
 
sergeev:
oui.

Au fait, ça ne marche pas non plus :

class cl2; 

class cl1
{
public:
        int q;
        void fn2(cl2 *t){t->i = 87;}
};


class cl2
{
public:
        int i;
        void fn(cl1 *w){w->q = 9;}
};

Voici comment cela fonctionne :

class cl2; 

class cl1
{
public:
        int q;
        void fn2(cl2 *t);


class cl2
{
public:
        int i;
        void fn(cl1 *w);
};

void cl1::fn2(cl2 *t){t->i = 87;}
void cl2::fn(cl1 *w){w->q = 9;}

220Volt:
Et voilà, les peluches sont enlevées :). Merci.

Non, non, non, non ! Gardez le plus. "MS est nul, MQ est roi !"

 

Vous pouvez aussi faire comme ça :

class cl2; 

class cl1
{
public:
        int q;
        void fn2(cl2 *t);//{t->i = 87;} // здесь реализация не прокатит: ещё неизвестен размер и состав класса cl2
};                                    // например, откуда последовательному компилятору знать о члене 'i' ?


class cl2
{
public:
        int i;
        void fn(cl1 *w){w->q = 9;} // размер и состав класса cl1 уже известен на этом этапе. поэтому можно здесь.
};

void cl1::fn2(cl2 *t){t->i = 87;}
//void cl2::fn(cl1 *w){w->q = 9;}
La principale chose à retenir est que les règles C++ sont conçues pour être compilées de manière séquentielle.
 
220Volt: Il se compile dans MQL sans erreur, il ne se compile pas dans VS (le programmeur lui indique qu'il ne peut pas utiliser la classe sans définition). Pourquoi ?

VS a raison, bien sûr. La déclaration suffira si vous prenez l'implémentation de la fonction fn2 en dehors de la classe et après la définition de cl2.

Comme la fonction est définie directement dans le corps, une simple déclaration ne fonctionne pas (bien que le passage par référence), car la définition de la cl2 est nécessaire pour que la fonction fonctionne.

Soit un bug, soit une erreur. Il est fort probable qu'il s'agisse de la seconde option, mais il est préférable de clarifier les choses.