2016-04-16 4 views
0

基本的には、私は基本クラスmaterialを持っています。マテリアルには多くの仮想機能があり、そのうちの1つは「ダブルDVD」(マテリアルのタイプですが、別のマテリアルである2つのDVDで構成されています)と呼ばれています。派生クラスを使用するときに "循環インクルード"の周りを見つける

最初は、 "Set"という派生クラスのマテリアルのペア/ベクタとして保存し、material.hで定義された仮想関数を使用して2つのポインタのベクトルを返すと思っていました(またはそれ以上の)DVDオブジェクトが格納される。このコードは絶対に壮大な方法をで壊すせ

#ifndef CWK_MAT_H 
#define CWK_MAT_H 
#include "DVD.h" 
#include <string> 
#include <vector> 
namespace MATERIALS 
{ 

virtual std::vector<DVD *> getPointers() { return std::vector<DVD *>(); } 

しかし、問題は、これがこのようなMaterials.hに「DVD.h」を含めることを必要としたということです。この問題を回避する方法はありますか?

std::vector<Material *> vect; 

vect[1]->getPointers() 

のように、私はのベクトルにそれを変更しようとした:私は、私はこのベクターからもアクセスできるように、材料のクラスにあるようにポインタを取得するために仮想メソッドが必要私はそれを派生クラスの "set"(Materialから派生したもの、DoubleDVDはSetから派生したもの)に変更するとVisual Studioが基本的にフリーズし、IntelliSenseが永久に更新されます)

Isこれを行う方法はありますか?

+0

[C++ - フォワード宣言]の可能な複製(http://stackoverflow.com/questions/4757565/c-forward-declaration) – xaxxon

答えて

2

フルタイプの情報を含む.hファイルを含める代わりに、ポインタまたは参照のみを使用するクラスを宣言して転送することができます。 DVDポインタのベクトルを使用する前に、単にclass DVD;と入力してください。前方宣言は、基本的にコンパイラに "ねえ、このタイプが存在していて、実際にその情報が必要なときに私はあなたにもっと詳しく説明します"と伝えています。それはポインタ(と参照、基本的に単なるポインタです)は常に同じサイズなので、コンパイラは実際にそれらを処理するための情報を必要としません。 ( - テンプレートクラスメソッド時々でこれを行うことができません可能な場合)は、あなたがあなたの状況の多くを取り除くまた、代わりに.cppファイル内の関数のコードを入れて

https://stackoverflow.com/a/4757718/493106

#include .cppファイルは何もないので、循環インクルードで終わります。

+0

ああ、うわー。これほど何かが分かったことはありませんでした。ありがとう、Xaxxon。 –

+0

お寄せいただきありがとうございます。クラス内のメンバーを参照する前に、フルタイプの情報(.hファイル)が存在する必要があります。 DVD *は問題ありませんが、myDvd-> chapterList;または完全な型情報が必要なものは何でも。 – xaxxon

関連する問題