2017-09-27 5 views
0

C++クラスでは、別のサブセット内からスーパーセットの変数にアクセスするにはどうすればよいですか?これは、あなたが理解するための例としてのみ視覚的に表示することができます。サブセット内のスーパーセット変数に別のサブセット内でアクセスする

CIAは大統領の上にあり、大統領からの機密情報を保持する権利を持っています。

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; 
} 

どのようにアクセスすることができますaliensExistSubsetクラス内からPresidentクラス内のメソッドを使用していますか?

私は上記の例が非論理的であり、もちろんPresidentCIAにアクセスできないことを知っていますが、それは直接的な部分集合ではありませんが、これについての良いアプローチは何ですか?

+1

'doAliensExist()'を抽象メソッドにし、それを 'Subset'でオーバーライドします。詳細については[C++の本を参照](https://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)を参照してください。 –

+0

基本クラスは互いに知識がありません。 'Subset'クラスが持っていて、座標を合わせることができるかもしれません。 –

+0

あなたが "これのようなもの"についてより具体的でない限り、あなたはコメントまたはダウン票だけを得るでしょう。前の2つのコメントでは、あなたが望むものを達成する方法があるかもしれないが、明確に例が代表的ではないことを明確に伝える必要があります(あなたが自分自身と言うように、エイリアンにはアクセスできません) –

答えて

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

それは動作する答えですが、私は他の答えがある場合に備えてお待ちしています。'Subset'クラスがそれを調整する必要はなく、' President'クラスだけを調整するのが望ましいでしょうが、少なくとも解決策のように思えます。 – Acidic

0

まあ、私は生産のコードでそれを使用してお勧めしませんが、これは理論的な問題のようですので、...

*サブセットにこれをdynamic_castをすることが可能です(と、それはまただろう使用することが可能でCスタイルのタイプが(Subset*)thisを投げ、それは互換性のないクラスの場合)には投げません:

おそらくそれはdoAliensExistを作るために大丈夫ですので、問題の社長への変更には明確な制限がなかった
#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; 
} 

()仮想クラスを作成する多型Cスタイルのキャストでは、それは必要ではありません。考え直し上ものの

、)(仮想関数を追加する代わりにdoAliensExistを変更すると、同じようにうまくなります

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

あなたが継承間違って使用して(上)です。もちろん、モデルが根本的に間違っているため、解決策を見つけるのに問題があります。あなたはそれらの間のis aの関係、すなわちD is a Bがあるときに限り

クラスDクラスBから継承する必要があります...クラス階層が何とか数学セットにアナログである印象の下にあるように見えます。その実体が同時にCIA 社長になるので

あなたの例では、CIAPresidentの両方を継承しても意味がありません。私はそれが憲法に違反していると思う(あるいは少なくとも違法である)。

モデルを変更する必要があります。 OOPと継承は聖杯ではなく、すべての問題を解決します。

関連する問題