1

我有两个类,其中一个包含第三类实例的向量。

基本上我有三个类:

  • 公司
  • 市场
  • 股票

公司和市场可以有 0..* 股票和股票必须链接到 1 个市场和 1 个公司(打印价值等...)

我不知道如何正确地做到这一点。对我来说,问题是当我在市场和公司中做一个股票向量时,我不能在公司和市场的股票中放置一个链接,因为当 Equities.h 是第一个时,它不知道市场和公司类在股票类。如果 Corporation.h 和 Market.h 是第一个,它会说我比它不知道 Corporation 和 Market 类中的 Equities 类。

为此构建解决方案的最佳代码是什么?我不能对 VisualStudio 说,当他看到一门课比它从未见过的课时离开?(因为定义只是到下一个所以它什么都没有改变......:()在C ++中不可能有第一类:第二类的链接或向量和第二类:链接或向量当我们构建解决方案时,第一堂课没有问题?

编辑:

这是工作,我写了“类股票;类公司;类市场;” 它并不关心它不知道这些类的事实。感谢大家,它是如此之快!当我完成我的工作时,我会阅读你的链接。:)

4

5 回答 5

4

最简单的方法是在一个公共标头中转发声明或原型化所有类和类型,在其上放置保护,并包含所有代码文件中的标头。例如:

标头.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*/

身体.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
{
  // ...
}


金融应用程序.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)
   { ... }

}     

请注意,工作类中的每一个都作为“基类”,并且工作类相互引用基类,而不是类本身。这可以帮助您避免难以使用的循环/转发内容。

请注意,有一个应用程序。作为主类和关联类(“权益”)的容器的类。

检查“股权”类是否代表“市场”和“公司”之间的关联。该类不是“市场”和“公司”的一部分,而是“应用程序”的组成部分。如果你想添加任何类,你可以通过容器来完成,而不是添加到类本身的列表中。

另外请注意,还有一个额外的“金融根基类”,它可以帮助您处理与所有类共享的内容。

于 2011-06-09T16:04:50.687 回答