2017-10-13 18 views
0

循環依存関係を避けるために宣言クラス変数を他のクラスに転送することはできますか? 例:クラス変数の前方宣言

//another file 
class Engine; 
extern vector<Block*> Engine::MapBlocks; 

//Engine.h 
class Engine 
{ 
public: 
    vector<Block*> MapBlocks; 
}; 

可能ですか?

+1

Nopeは動作しません – CoryKramer

+0

C++には部分クラスがありません。 – Ron

答えて

0

いいえ、あなたがしようとしていることはできません。静的でないクラスメンバをクラス定義の外に宣言することはできません。そのようなことが許可されている場合は、任意のコードが任意のクラスを任意に変更できるようになります(実際にクラスの一部ではないメンバーを宣言するなど)。論理的には、クラス(カプセル化など)を完全に使用する意図が破られます。

しかし、定義を見ることなく、クラスタイプへのポインタを渡して格納することは可能です。コンパイラは、コンテナ内のポインタを格納するBlockの定義の可視性を持っている必要はありませんので、この場合

#include <vector>  // necessary for use of std::vector 

class Block; 

class Engine 
{ 
    public: 
    std::vector<Block*> MapBlocks; 

     // preferably declare constructors and/or other member functions 
     // that initialise MapBlocks appropriately to needs 
}; 

ではこれが動作します。

当然

Block(例えばsome_engine.MapBlocks.push_back(new Block))をインスタンス化するか、そのメンバ関数を呼び出そうと、任意のコード(例えばsome_engine.MapBlocks[some_valid_index]->some_member_function())クラスBlockだけでなく、前方宣言の定義の可視性に依存しています。

3

ない

あなたのクラス宣言が完了しなければならない、あなたはそれを分割したり、部分的にそれを宣言することはできません。

実際に発生した問題について質問した場合は、とにかくお手伝いできます。ほとんどの場合、この抽象的な質問だけでは解決策はありません。