2017-09-27 7 views
0

Dans les classes C++, comment accéder à une variable de super-ensemble à partir d'un autre sous-ensemble? Cela ne peut être montré visuellement comme un exemple pour vous de comprendre.Accéder à une variable de super-groupe à partir d'un sous-ensemble dans un autre sous-ensemble

L'ICA est au-dessus du président et a le droit de garder l'information confidentielle du président.

class CIA { 
public: 
    bool aliensExist = true; // 100% 
}; 

class President { 
public: 
    bool doAliensExist() { 
     return aliensExist; // Not sure, no access to CIA's aliensExist variable 
    } 
}; 

class Subset : public President, public CIA { 

}; 

int main() { 
    Subset subset; 
    cout << "Aliens exist = " << subset.doAliensExist() << endl; 
} 

Comment puis-je accéder à aliensExist en utilisant la méthode à l'intérieur President classe à partir de la classe Subset?

Je sais l'exemple ci-dessus est illogique et bien sûr President ne peut pas accéder CIA sans qu'il soit un sous-ensemble directement de celui-ci, mais je me demande ce qui est une bonne approche pour quelque chose comme ça?

+1

Faites 'doAliensExist()' une méthode abstraite et remplacez-la dans 'Subset'. Pour plus d'informations [voir votre livre C++] (https://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list). –

+0

Les classes de base ne se connaissent pas. La classe 'Subset' a, et pourrait être capable de coordonner. –

+0

À moins d'être plus précis sur «quelque chose comme ça», vous obtiendrez seulement des commentaires ou des votes négatifs. Comme 2 commentaires précédents disent, il pourrait y avoir moyen de réaliser ce que vous voulez, mais vous devez clairement dire ce que vous voulez en effet car l'exemple n'est pas représentatif (vous ne pouvez pas accéder aux extraterrestres Existez du président comme vous le dites) –

Répondre

1
#include <iostream> 
#include <stdexcept> 

using namespace std; 

class CIA { 
public: 
    bool aliensExist = true; 
}; 

class President { 
public: 
    bool doAliensExist() { 
     return _doAliensExist(); 
    } 

private: 
    virtual bool _doAliensExist() { 
     throw runtime_error("cannot access"); 
    } 
}; 

class Subset : public President, public CIA { 
private: 
    virtual bool _doAliensExist() { 
     return aliensExist; 
    } 
}; 

int main() { 
    cout << "Aliens exist = " << Subset().doAliensExist() << endl; 
} 
+0

C'est une réponse qui fonctionne, mais je vais attendre au cas où il y aurait d'autres réponses.Il serait préférable que la classe 'Subset' n'ait pas besoin de la coordonner, seulement la classe' President', mais cela semble au moins une solution. – Acidic

0

Eh bien, je ne recommanderais pas l'utiliser dans le code de production, mais comme cela semble être une question théorique ...

Il est possible de dynamic_cast cela * sous-ensemble (et il serait également possible d'utiliser le type de style c jeté (Subset*)this, mais ce ne serait pas jeter dans le cas des classes incompatibles):

#include <iostream> 
#include <stdexcept> 
using namespace std; 

class CIA { 
public: 
    bool aliensExist = true; 
}; 

class President { 
public: 
    virtual bool doAliensExist(); 
}; 

class Subset : public President, public CIA { 
}; 

bool President::doAliensExist() { 
    Subset* subset = dynamic_cast<Subset*>(this); 
    if(!subset) 
    { 
     std::runtime_error("cannot access"); 
    } 
    return subset->aliensExist; 
} 

int main() { 
    Subset subset; 
    cout << "Aliens exist = " << subset.doAliensExist() << endl; 
} 

il n'y avait pas de limites claires sur les modifications au Président de la question, donc soi-disant qu'il est normal de faire doAliensExist() virtuel pour faire classe polymorphe. Avec un casting de style C, ce ne serait pas nécessaire.

Bien que sur une seconde pensée, l'ajout d'une fonction virtuelle au lieu de changer doAliensExist() ferait tout aussi bien:

class President { 
public: 
    bool doAliensExist(); 
    virtual void dummy() {}; 
}; 
2

Vous êtes (plus) en utilisant mal l'héritage. Bien sûr, vous avez du mal à trouver une solution, car le modèle est fondamentalement erroné. Vous semblez être l'impression que la hiérarchie des classes est en quelque sorte analogue à des ensembles mathématiques ...

Une classe D devrait hériter d'une classe B ssi il existe une relation de is a entre eux, à savoir D is a B.

Dans votre exemple, il n'a pas de sens d'hériter à la fois CIA et President parce que cette entité serait CIA et président en même temps. Je pense que c'est contre la constitution (ou du moins illégale).

Vous devez donc changer de modèle. La POO et l'héritage n'est pas un Saint Graal, une solution pour tout.