Usando referências para acessar objetos de classe C++
-
26-12-2019 - |
Pergunta
Este me deixou perplexo.O que estou tentando fazer é fazer com que uma variável de referência em uma classe wrapper aponte para um objeto struct na classe que ela envolve, de modo que qualquer configuração de variáveis na estrutura de outras classes que usam a classe wrapper seja realmente definida no classe empacotada, não a classe wrapper.Para fazer isso, tentei simplesmente criar uma referência na classe wrap para a estrutura na classe wrap, como
class CClassWrap
{
CClass::plot_type& PlotArgs;
}
e então inicie PlotArgs
CClassWrap::InitWrap( CClass AppIfx )
{
PlotArgs = AppIfx.PlotArgs;
}
Eu só quero que PlotArgs aponte para PlotArgs da classe empacotada para que quando PlotArgs for acessado diga isto
class StudiesBase:public CClassWrap
{
//12 should show up in CClass because PlotArgs in CClassWrap points to the PlotArgs on CClass.
PlotArgs.value = 12;
}
12 aparece na versão de classes agrupadas de PlotArgs.Para fazer isso tentei definir uma referência definida no arquivo .h da seguinte forma
#include "CClass.h"
class CClassWrap
{
//PlotArgs is a struct with a few vars in it (int, long, etc.) that exists in CClass
CClass::plot_type& PlotArgs;
}
CClassWrap é herdado em outra classe, chame-a de StudiesBase
class StudiesBase:: public CClassWrap
{
etc...
}
Quando isso é compilado, é exibido um erro dizendo que não existe um ctor padrão para CClassWrap.Então eu adiciono um Ctor
tal que CClassWrap agora se pareça
class CClassWrap
{
public:
CClassWrap();
public:
//PlotArgs is a struct with a few vars in it (int, long, etc.) that exists in CClass
CClass::plot_type& PlotArgs;
}
Isso gera um erro C2758 dizendo que PlotArgs não foi inicializado.
Então, no ctor do ClassWrap, tento iniciá-lo.
PlotArgs = AppIfx.PlotArgs;
onde AppIfx é definido em tempo de execução como um ponteiro para o objeto CClass.O compilador também não gosta disso com o erro C2758, a variável deve ser inicializada na base do construtor/lista de inicializadores de membros, etc.
Se parecer que estou tentando fazer algo que tenho total clareza sobre como fazer, esse seria definitivamente o caso!Qualquer ajuda seria muito apreciada.
Solução
Foi aqui que você errou
CClassWrap::InitWrap( CClass AppIfx )
{
PlotArgs = AppIfx.PlotArgs;
}
você não pode religar uma referência.Uma vez que uma referência se refere a algo, ela nunca pode ser feita para se referir a outra coisa.Este código (se você o executou) atribuiria AppIfx.PlotArgs
para qualquer coisa PlotArgs
mencionado, claramente não é isso que você pretendia.
Você deve mover este código para o construtor
CClassWrap::CClassWrap( CClass AppIfx ) : PlotArgs(AppIfx.PlotArgs)
{
}
Mas observe também que esse código construtor copia o objeto CClass, portanto, ele pode não fazer o que você espera (você pode acabar se referindo a um objeto PlotArgs copiado, embora isso dependa de como o construtor de cópia CClass funciona).Então provavelmente é melhor usar uma referência aqui também
CClassWrap::CClassWrap( CClass& AppIfx ) : PlotArgs(AppIfx.PlotArgs)
{
}