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.

Foi útil?

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)
{
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top