【问题标题】:How can I have two classes linked each other by a vector (map, multimap..) in C++?如何在 C++ 中通过向量(map、multimap ..)将两个类相互链接?
【发布时间】:2011-09-11 18:42:06
【问题描述】:

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

基本上我有三个类:

  • 公司
  • 市场
  • 股票

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

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

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

编辑:

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

【问题讨论】:

  • 这是一个糟糕的设计。请考虑修改。看看coupling

标签: c++ class dictionary vector multimap


【解决方案1】:

您正在寻找include guardsforward declarations。因此,您可以将 class Market; 放在尚未定义 Market 的位置。

【讨论】:

    【解决方案2】:

    你要找的是术语circular dependency 看这里:http://en.wikipedia.org/wiki/Circular_dependency

    因此,您可以将class Market; 放在尚未定义Market 的位置。

    【讨论】:

      【解决方案3】:

      怎么样:

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

      【讨论】:

        【解决方案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 保护。

        【讨论】:

        • 谢谢你的工作!问题不是因为 .h 被调用两次或更多,而是因为在读取课程时他没有被调用。所以我试着把“类公司”;这是他不在乎并构建解决方案的工作! :)
        【解决方案5】:

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


        FinancialApp.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”)的容器的类。

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-26
          • 2018-10-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多