使用Graph时将Vector传递给函数

时间:2013-12-16 22:35:59

标签: c++ algorithm graph graph-algorithm

我在类中编写了这样的代码来计算从源到节点的最大距离。现在我需要将它从课堂中拿出并具有类似的功能来计算我的距离,但是使用了Djikstra。所以,我需要传递这个城市矢量和源作为我的顶点之一(这将循环顶点)并从该函数返回一个距离返回到类以进行下一次计算。我没时间了,请帮助我。

int distanceToNearCity(int cityIdOfStore, const std::vector<City> & AllCities) const
{
  // is there a store in this city ?
  if (storeExists || cityId == cityIdOfProposedNewStore)
  {
     return 0; // 0 distance
  }

  int distance = TOOFAR; // initialise with more than max allowed
  for (int i=0; i<connectingCities.size(); ++i)
  {
     int id = connectingCities[i];
     if (AllCities[id-1].hasStore() || AllCities[id-1].getId() == cityIdOfProposedNewStore)
     {
       // we have a store (or proposed one) here, but is it's distance more than other stores ?
       if (distances[i] < distance)
       {
          distance = distances[i];
       }
     }
  }

  return distance;
}

如何将这些类对象传递给public.Thanks !!

1 个答案:

答案 0 :(得分:2)

好吧,从main访问内部成员变量可能是一个糟糕的设计,打破封装,可能是问题的根源,因此不是一个好主意。

解决方案1 ​​

假设您的班级名为MyOriginal。将distanceToNearCity设为虚拟。创建派生类MyDerived并重写distanceToNearCity以实现Djikstra。在派生类中,只要它们是公共的或受保护的,您就可以从MyOriginal访问原始成员变量。用户(主)不需要知道实现细节。

解决方案2

重写原始distanceToNearCity方法,因为它没有副作用,因为它有静态方法。这意味着它不需要访问任何成员变量。通过参数将所有参数传递给方法。我提到'因为它是一个静态方法',因为该方法不是原始MyOriginal类的成员。将MyOriginal设为模板类,在外部类中实现distanceToNearCity,并将此类作为模板参数传递给MyOriginal。作为非成员,您可以实现任意数量的距离算法并将它们传递给原始类。这个解决方案的优点是,对“虚拟”方法的调用在编译时是已知的,因此它可以生成更快的代码。

template<class T> // T will contain distance computation
class MyOriginal
{
public:
  void process()
  {
    .. // your staff
    int distance = T::distanceToNearCity(necessary arguments); // call the external implementation
    .. // rest of your staff
  }
};
class OriginalDistance
{
public: 
  static int distanceToNearCity(necessary arguments); // your original implementation
};
class DjikstraDistance
{
public: 
  static int distanceToNearCity(necessary arguments); // another distance computation
};

int main(int argc, char *argv[])
{
  MyOriginal<DjikstraDistance> myInstance;
  myInstance.process(); // call processing, use DjikstraDistance::distanceToNearCity() inside
}

解决方案3

如果您出于某种原因不喜欢以前的实现,则可以使用“c”样式解决方案。创建一个表示distanceToNearCity方法签名的类型。 写'distanceToNearCityOriginal'和'distanceToNearCityDjikstra'功能。将指向所需函数的指针作为MyOriginal::process方法的参数传递。 C ++开发人员会不喜欢你。

typedef int (DistanceAlgo*)(necessary arguments); // pointer to a function which returns int
int distanceToNearCityOriginal(necessary arguments); // first implementation of distance
int distanceToNearCityDjikstra(necessary arguments); // second implementation of distance
class MyOriginal
{
public:
  void process(DistanceAlgo algo)
  {
    .. // your staff
    int distance = (*algo)(necessary arguments); // call the external implementation
    .. // rest of your staff
  }
};
int main(int argc, char *argv[])
{
  DistanceAlgo algo = &distanceToNearCityDjikstra; // choose djikstra
  MyOriginal myInstance;
  myInstance.process(algo); // call processing, use distanceToNearCityDjikstra inside
}