Rafael Abrantes Penchel Postado Junho 5, 2010 Denunciar Share Postado Junho 5, 2010 Boa tarde,Estou com um erro de compilação que sinceramente não entendo a razão. Seja a seguinte classe pai:http://pastebin.com/uiAZFmUxEm seguida faço uma herança do tipo public, e na outra classe faço "herança de herança" (não sei o termo para isso)http://pastebin.com/Zcnu9vsYquando vou definir o constructor, ( http://pastebin.com/ZzgBqJWB ) o compilador diz que:'antenna::Npt' : cannot access protected member declared in class 'antenna''antenna::Type' : cannot access protected member declared in class 'antenna'Como não posso acessar Npt e Type se são declarados como protected, e estou acessando-os de uma classe derivada da classe pai?Desde já agradeço a atenção.Obrigado. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jonathan Queiroz Postado Junho 6, 2010 Denunciar Share Postado Junho 6, 2010 O problema não ocorre porque a tentativa de acessar o membro protected é feita pela classe "avô". A classe classic tem acesso aos atributos protected da classe antenna, mas só tem acesso aos valores do próprio objeto. Ou seja:classic::testFunc(){ Npt=5; //isso funciona, pois está trabalhando com um atributo do mesmo objeto (this->Npt) antenna a; a.Npt=10; //isso não funciona, pois trabalhamos com um atributo de outro objeto (a.Npt) } Recomendo a leitura desse artigo: Proteção dos membros protected. A solução é, ao invés de você tentar ler os atributos de inAnt, passar esse objeto para o construtor de cópia da classe antenna, pois o construtor tem acesso a qualquer propriedade da mesma classe. O seu código ficar assim: class antenna { public: // constructors antenna(const int inNpt, char * inType); antenna(); ~antenna(){}; // protected member varibles protected: vector<double> * sub_reflector; vector<double> * main_reflector; int Npt; char * Type; }; class omnidirectional : public antenna { public: omnidirectional(antenna); ~omnidirectional(){}; protected: vector<double> P1, P2, Q; double Wa, Vs, Ds, Vm, Dm, Db, Zb, Gama, thetaE; }; omnidirectional::omnidirectional(antenna x) :antenna(x) //chama o construtor de cópia de antenna { } // class classic omnidirectional antennas; class classic : public omnidirectional { public: classic(antenna inAnt, double inWa, double inVs, double inDm, double inDb, double inZb, double inLb, double inGama); classic(); ~classic(){}; }; classic::classic(antenna inAnt, double inWa, double inVs, double inDm, double inDb, double inZb, double inLb, double inGama) :omnidirectional(inAnt) //construtor de omnidirectional { Wa = inWa * inLb; Vs = inVs * inLb; Dm = inDm * inLb; Db = inDb * inLb; Zb = inZb * inLb; Gama = inGama * pi/180; }Não sei se seu código está realmente assim ou se adaptou para postar, mas acho que não faz muito sentido passar um objeto antenna para a classe classic, já que ela não deriva diretamente de antenna, e sim de omnidirectional. Acho que faria mais sentido passar um objeto da classe omnidirectional para o construtor de classic ao invés de um antenna. Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Rafael Abrantes Penchel
Boa tarde,
Estou com um erro de compilação que sinceramente não entendo a razão. Seja a seguinte classe pai:
http://pastebin.com/uiAZFmUx
Em seguida faço uma herança do tipo public, e na outra classe faço "herança de herança" (não sei o termo para isso)
http://pastebin.com/Zcnu9vsY
quando vou definir o constructor, ( http://pastebin.com/ZzgBqJWB ) o compilador diz que:
'antenna::Npt' : cannot access protected member declared in class 'antenna'
'antenna::Type' : cannot access protected member declared in class 'antenna'
Como não posso acessar Npt e Type se são declarados como protected, e estou acessando-os de uma classe derivada da classe pai?
Desde já agradeço a atenção.
Obrigado.
Link para o comentário
Compartilhar em outros sites
1 resposta a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.