1

3番目のクラスのインスタンスを保持するベクトルを持つ2つのクラスがあります。

基本的に私は3つのクラスを持っています:

  • 株式会社
  • 市場
  • エクイティ

企業と市場は0..*を持つことができます。株式と株式は、1つの市場と1つの企業にリンクする必要があります(値などを印刷するため)。

私はそれを正しく行う方法がわかりません。私にとって問題は、市場と企業で株式の1つのベクトルを実行する場合、Equities.hが最初の場合、市場と企業のクラスがわからないため、企業と市場の株式にリンクを張ることができないことです。エクイティクラス。そして、Corporation.hとMarket.hが最初である場合、CorporationとMarketクラスにあるEquitiesクラスを知らないよりも私に言います。

このためのソリューションを構築するための最良のコードは何ですか?VisualStudioに、クラスが表示されたときに、これまでに表示されていないクラスを終了するように言うことはできませんか?(定義は次のものであるため、何も変更されません... :()C ++では、最初のクラスに2番目のクラスのリンクまたはベクトルを、2番目のクラスに次のリンクまたはベクトルを含めることはできません。ソリューションを構築するときに問題のないファーストクラス?

編集:

それは仕事です、私は「クラスエクイティ;クラスコーポレーション;クラスマーケット;」と書きました。そしてそれはこれらのクラスを知らなかったという事実を気にしませんでした。みんなのおかげでとても速かったです!仕事が終わったらあなたのリンクを読みます。:)

4

5 に答える 5

4

最も簡単な方法は、すべてのクラスとタイプを共通のヘッダーで前方宣言またはプロトタイプ化し、それにガードを配置し、すべてのコードファイルのヘッダーを含めることです。例えば:

header.hpp:

#ifndef COMMON_HPP
#define COMMON_HPP

class Corporation;
class Market;
class Equities;

typedef std::shared_ptr<Corporation> CorpRef;

typedef std::list<CorpRef> CorpList;

#endif /*COMMON_HPP*/

body.cpp:

#include header.hpp

class Corporation
{
    static CorpRef Create();
};

等々。

Visual Studioを排他的に使用している場合は、ガード#pragma onceの代わりに使用できます。#ifndef

于 2011-06-09T14:43:08.247 に答える
3

インクルードガード前方宣言を探しています。class Market;したがって、マーケットがまだ定義されていない場所に配置することができます。

于 2011-06-09T14:37:57.950 に答える
1

あなたが探しているのはcircular dependencyここでの用語の見方です:http://en.wikipedia.org/wiki/Circular_dependency

したがって、まだ定義されていないclass Market;場所に線を配置することができます。Market

于 2011-06-09T14:37:59.753 に答える
1

どうですか:

struct Corporation {
     vector <class Equity *> equities;
}

struct Market {
     vector <class Equity *> equities;
};

struct Equity {
     Market * market;
     Corporation * corp;
};
于 2011-06-09T14:39:46.370 に答える
0

「peachykeen」オプションが最適な場合もありますが、継承を使用したり、エンティティをサブクラス化したりする場合に役立つ別のオプションは次のとおりです。


宣言.h


// these classes doesn't have references to each others

public class FinantialBaseClass
{
  // ...
}

public class CorporationBaseClass: FinantialBaseClass
{
  // ...
}

public class MarketBaseClass: FinantialBaseClass
{
  // ...
}

public class EquitiesBaseClass: FinantialBaseClass
{
  // ...
}


FinantialApp.h


// these classes have references, but, to parent classes,
// not each others

public class CorporationClass: CorporationBaseClass
{
  vector<EquitiesBaseClass> Equities;
}

public class MarketClass: MarketBaseClass
{
  vector<EquitiesBaseClass> Equities;
}

public class EquitiesClass: EquitiesBaseClass
{
  public CorporationBaseClass* Corporation;

  public MarketBaseClass* Market;

}

public class MyFinantialAppClass
{
  protected vector<CorporationBaseClass> Corporations;

  protected vector<MarketBaseClass> Markets;

  protected vector<EquitiesBaseClass> Equities;

  public CorporationBaseClass* addCorporation() { ... }

  public MarketBaseClass* addMarket() { ... }

  public EquitiesBaseClass* addEquity(CorporationBaseClass, MarketBaseClass)
   { ... }

}     

作業クラスは、それぞれが「基本クラス」として機能し、作業クラスは、クラス自体ではなく、相互に基本クラスを参照することに注意してください。それはあなたがそれが使いにくい循環/前方のものを避けるのを助けます。

アプリがあることに注意してください。メインクラスおよびアソシエーションクラス(「エクイティ」)のコンテナとして機能するクラス。

「equity」クラスが「Market」と「Corporation」の間の関連付けを表していることを確認します。そのクラスは「 Market」と「Corporation」の一部ではなく、「App」のコンポーネントです。クラスを追加する場合は、クラス自体のリストではなく、コンテナを介して追加します。

追加として、すべてのクラスで共有されるものを支援する可能性のある追加の「最終ルート基本クラス」があることに注意してください。

于 2011-06-09T16:04:50.687 に答える