Domande da un "manichino" - pagina 139

 
220Volt:
Sì, credo che dovrei dargli un segno più ))
Buona illustrazione dell'inutilità della domanda "perché?". Forse ci sono altre domande? :)
 
MetaDriver:
Buona illustrazione dell'inutilità della domanda "perché?", forse ci sono altre domande? :)
:) Ecco un pensiero - forse ci dovrebbe essere qualche altro modo per farlo in VS? O è inutile?
 
220Volt:
:) Un pensiero - c'è qualche altro modo per farlo in VS? O è inutile?
Questa è la domanda giusta e utile, ora gli esperti possono darti una risposta significativa... :)
 
220Volt:
:) Ho un'idea - forse VS dovrebbe avere un modo diverso di fare le cose?
Sì.
 
//--------- 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:
Sì...
Beh, chiunque può farlo... fai funzionare le variabili di riferimento... :) :)
 
MetaDriver:

Ecco, il più è partito :). Grazie.
 
sergeev:
Sì.

A proposito, neanche questo funziona:

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;}
};

Ecco come funziona:

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:
Ecco fatto, il plushie è partito :). Grazie.

No, no, no, no, no, no! Mantenete il plus: "MS fa schifo, MQ è il re!"

 

Si può anche fare così:

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 cosa principale da ricordare è che le regole C++ sono progettate per compilare in modo sequenziale.
 
220Volt: Si compila in MQL senza errori, non si compila in VS (il programmatore sta dicendo al programmatore che non può usare la classe senza definizione). Perché?

VS ha ragione, naturalmente. La dichiarazione sarà sufficiente se prendete l'implementazione della funzione fn2 fuori dalla classe e dopo la definizione cl2.

Poiché la funzione è definita proprio nel corpo, una semplice dichiarazione non funziona (anche se si passa per riferimento), perché la definizione cl2 è necessaria perché la funzione funzioni.

O è un bug o è un bug. Molto probabilmente è la seconda, ma meglio chiarire.