Perguntas de um "boneco" - página 139

 
220Volt:
Sim, acho que devo dar-lhe um sinal de mais ))
Boa ilustração da inutilidade da pergunta "porquê?". Talvez haja outras perguntas? :)
 
MetaDriver:
Boa ilustração da inutilidade da pergunta "porquê?", talvez haja outras questões? :)
:) Eis uma ideia - talvez devesse haver outra forma de o fazer em VS? Ou será inútil?
 
220Volt:
:) Um pensamento - há alguma outra forma de o fazer em VS? Ou será inútil?
Esta é a pergunta certa e útil. Agora os peritos podem dar-lhe uma resposta significativa... :)
 
220Volt:
:) Tenho uma ideia - talvez a VS devesse ter uma maneira diferente de fazer as coisas?
sim.
 
//--------- 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:
Sim.
Bem, qualquer um pode fazê-lo... faz com que as variáveis de referência funcionem... :) :)
 
MetaDriver:

Aí está, o mais um está desligado :). Obrigado.
 
sergeev:
sim.

A propósito, isso também não 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;}
};

É assim que 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:
Aí está, o plushie está desligado :). Obrigado.

Não, não, não, não! Guarde o mais: "A EM não presta, MQ é rei"!

 

Também se pode ir assim:

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;}
O principal a lembrar é que as regras C++ são concebidas para compilar sequencialmente.
 
220Volt: Compila em MQL sem erros, não compila em VS (o programador está a dizer ao programador que não pode utilizar a classe sem definição). Porquê?

O VS está certo, claro. A declaração será suficiente se se tomar a implementação da função fn2 fora da classe e após a definição cl2.

Uma vez que a função é definida correctamente no corpo, uma simples declaração não funciona (embora passe por referência), porque a definição cl2 é necessária para que a função funcione.

Ou é um insecto ou um insecto. O mais provável é que seja este último, mas é melhor esclarecer.

Razão: