Как я могу иметь два класса, связанных друг с другом вектором (map, multimap ..) в C ++? - PullRequest
1 голос
/ 09 июня 2011

У меня есть два класса с вектором, который содержит экземпляры третьего класса.

В основном у меня есть три класса:

  • Корпорация
  • Рынок
  • Акции

Корпорация и рынок могут иметь 0 .. * акции и акции должны быть связаны с 1 рынком и 1 корпорацией (для печати значений и т. Д.) *

Я не знаю, как сделать это правильно.Для меня проблема заключается в том, что, когда я делаю один вектор акций на рынке и в соавторстве, я не могу поместить ссылку в Equities for Corporation и Market, потому что когда Equities.h первый, он не знает класса Market и Corporation, найденного вКласс акций.И если Corporation.h и Market.h первыми говорят «мне», то они не знают, какой класс Equities можно найти в классе «Корпорация» и «Market».

Какой код лучше всего подходит для решения этой проблемы?Я не могу сказать VisualStudio уйти, когда он увидит класс, чем он никогда не видел уже?(поскольку определение относится только к следующему, поэтому оно ничего не меняет ... :() В C ++ невозможно иметь в первом классе: ссылку или вектор второго класса, а во втором классе: ссылку или векторпервый класс без проблем, когда мы строим решение?

Редактировать:

Это работа, я написал "Класс Акции; Класс Корпорация; Класс Маркет;"тот факт, что он не знал этих классов. Спасибо всем, что это было так быстро! Я прочитаю вашу ссылку, когда я закончу свою работу.:)

Ответы [ 5 ]

4 голосов
/ 09 июня 2011

Самый простой способ - это объявить или прототипировать все классы и типы в общем заголовке, поместить на него защиту и включить заголовок из всех ваших файлов кода.Например:

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 охранников.

3 голосов
/ 09 июня 2011

Вы ищете включая охранников и предварительные декларации . Таким образом, вы можете просто поместить class Market; в место, где еще не определен рынок.

1 голос
/ 09 июня 2011

Как насчет:

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

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

struct Equity {
     Market * market;
     Corporation * corp;
};
1 голос
/ 09 июня 2011

Что вы ищете, так это термин circular dependency посмотрите здесь: http://en.wikipedia.org/wiki/Circular_dependency

Итак, вы можете просто поставить строку class Market; на место, где Market еще не определено.

0 голосов
/ 09 июня 2011
Опция

«peachykeen» может быть оптимальной, но другой вариант, который может вам помочь, если вы используете наследование или подклассы своих сущностей, может быть:


Declarations.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").

Убедитесь, что класс "equity" представляет связь между "Market" и "Corporation".Этот класс является НЕ частью «Рынка» и «Корпорации», но компонентом «Приложения».Если вы хотите добавить какой-либо класс, вы делаете это через контейнер, а не в список самих классов.

Обратите внимание, что в качестве дополнительного есть дополнительный «базовый класс финансовых средств», это может помочь вам с вещами, которыми поделились все классы.

...