我在类中编写了这样的代码来计算从源到节点的最大距离。现在我需要将它从课堂中拿出并具有类似的功能来计算我的距离,但是使用了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 !!
答案 0 :(得分:2)
好吧,从main访问内部成员变量可能是一个糟糕的设计,打破封装,可能是问题的根源,因此不是一个好主意。
假设您的班级名为MyOriginal。将distanceToNearCity
设为虚拟。创建派生类MyDerived
并重写distanceToNearCity
以实现Djikstra。在派生类中,只要它们是公共的或受保护的,您就可以从MyOriginal
访问原始成员变量。用户(主)不需要知道实现细节。
重写原始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
}
如果您出于某种原因不喜欢以前的实现,则可以使用“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
}