Preguntas de un "tonto" - página 139

 
220Volt:
Sí, supongo que debería ponerle un signo más ))
Una buena ilustración de la inutilidad de la pregunta "¿por qué?". ¿Quizás haya otras preguntas? :)
 
MetaDriver:
Una buena ilustración de la inutilidad de la pregunta "¿por qué?". ¿Quizás haya otras preguntas? :)
:) Se me ocurre una idea: ¿quizás debería haber alguna otra forma de hacerlo en VS? ¿O es inútil?
 
220Volt:
:) Una idea: ¿hay alguna otra forma de hacerlo en VS? ¿O es inútil?
Esa es la pregunta correcta, y útil. Ahora los expertos pueden darle una respuesta significativa... :)
 
220Volt:
:) Tengo una idea: ¿quizás VS debería tener una forma diferente de hacer las cosas?
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í.
Bueno, cualquiera puede hacerlo... haces funcionar las variables de referencia... :) :)
 
MetaDriver:

Ahí lo tienes, el plus se ha quitado :). Gracias.
 
sergeev:
Sí.

Por cierto, eso tampoco funciona:

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

Así es como funciona:

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:
Ahí lo tienes, el peluche está fuera :). Gracias.

¡No, no, no, no! Quédate con el plus. "¡MS es una mierda, MQ es el rey!"

 

También se puede hacer así:

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;}
Lo principal es recordar que las reglas de C++ están diseñadas para compilar secuencialmente.
 
220Volt: Compila en MQL sin errores, no compila en VS (el programador está diciendo que no puede usar la clase sin definición). ¿Por qué?

VS tiene razón, por supuesto. La declaración será suficiente si se toma la implementación de la función fn2 fuera de la clase y después de la definición de cl2.

Dado que la función se define justo en el cuerpo, una simple declaración no funciona (aunque se pase por referencia), porque se requiere la definición de cl2 para que la función funcione.

O bien es un error o bien es un fallo. Lo más probable es que sea esto último, pero es mejor aclararlo.