C++ 在非常相似的方法之间共享代码

C++ 在非常相似的方法之间共享代码,c++,C++,我的工作是完全重写一个用于GIS矢量数据处理的旧库。main类封装了一组建筑轮廓,并提供了检查数据一致性的不同方法。这些检查函数有一个可选参数,允许执行某些过程 例如: std::vector<Point> checkIntersections(int process_mode = 0); std::向量检查交叉点(int process_mode=0); 此方法测试某些建筑轮廓是否相交,并返回交点。但是如果您传递一个非空参数,该方法将修改轮廓以删除交点 我认为这很糟糕(在调用站

我的工作是完全重写一个用于GIS矢量数据处理的旧库。main类封装了一组建筑轮廓,并提供了检查数据一致性的不同方法。这些检查函数有一个可选参数,允许执行某些过程

例如:

std::vector<Point> checkIntersections(int process_mode = 0);
std::向量检查交叉点(int process_mode=0);
此方法测试某些建筑轮廓是否相交,并返回交点。但是如果您传递一个非空参数,该方法将修改轮廓以删除交点

我认为这很糟糕(在调用站点,一个不熟悉代码库的读者会认为一个名为checkSomething的方法只执行一个检查而不修改数据),我想改变这一点。我还希望避免代码重复,因为检查和处理方法基本相似

所以我在想这样的事情:

// a private worker
std::vector<Point> workerIntersections(int process_mode = 0)
{
    // it's the equivalent of the current checkIntersections, it may perform
    // a process depending on process_mode
}


// public interfaces for check and process
std::vector<Point> checkIntersections()  /* const */
{
    workerIntersections(0);
}


std::vector<Point> processIntersections(int process_mode /*I have different process modes*/)
{
    workerIntersections(process_mode);
}
std::vector<Point> checkIntersections() const
{
    const_cast<TypeOfThis*>(this)->workerIntersections(0);
}
//私人工作者
std::矢量工作接口(int process_mode=0)
{
//它相当于当前的检查交叉点,它可以执行
//取决于进程模式的进程
}
//用于检查和处理的公共接口
std::vector checkcrossions()/*const*/
{
工作节(0);
}
std::vector processcrossions(int process_mode/*我有不同的处理模式*/)
{
工作区(过程模式);
}
但这迫使我打破常量正确性,因为WorkerinterSection是一种非常量方法


如何将检查和处理分开,避免代码重复并保持常量正确性?

正如您所指出的,您的建议将打破
常量正确性。
这是因为您的建议基本上包括使用新的
接口
包装现有代码,但不包括内部的
重新设计
。这种方法有严重的局限性,因为它直接受底层块的影响


相反,我建议您重新设计现有代码,只需在您需要的两个公共方法中打破
checkcross
checkcrosss
将包括检查部分,
processcrosss
将包括对
checkcrosss
的调用,以及基于
checkcrosss

结果的处理代码。在这种特殊情况下,中断常数的正确性应该无关紧要。您(作为
workerIntersections()
的作者)知道,如果从非常量函数
processcrossions()
调用,它将只执行非常量操作。因此,可以安全地实现
checkcrosss()

// a private worker
std::vector<Point> workerIntersections(int process_mode = 0)
{
    // it's the equivalent of the current checkIntersections, it may perform
    // a process depending on process_mode
}


// public interfaces for check and process
std::vector<Point> checkIntersections()  /* const */
{
    workerIntersections(0);
}


std::vector<Point> processIntersections(int process_mode /*I have different process modes*/)
{
    workerIntersections(process_mode);
}
std::vector<Point> checkIntersections() const
{
    const_cast<TypeOfThis*>(this)->workerIntersections(0);
}
std::向量检查交点()常量
{
const_cast(this)->workerIntersections(0);
}
当然,您必须确保
workerIntersections()
仅在使用
0
调用时执行常量操作


const\u cast
存在于该语言中是有原因的,主要是与忽略const正确性的遗留代码的互操作性。这正是您正在做的,所以只要您安全地执行,就可以使用
const\u cast

正如您所建议的那样,我选择了完全重新设计的方式。这将需要更多的时间,但结果会更好会好得多。