使用基于其他对象的对象构造函数重载函数的风险

问题描述 投票:0回答:0

我想我很清楚不时发生的事情。我有一个函数,

coordCopy()
,它有大量的重载。这是设计使然。我有五个不同的坐标对象,每个都有自己的优势和数据格式,我希望有一个 API 可以在它们中的任意两个之间进行相互转换。但是,有时,我在调试为什么某个 coordCopy() 调用没有按应有的方式运行时遇到了麻烦——现在我明白了原因:

warning: ISO C++ says that these are ambiguous, even though the worst
conversion for the first is better than the worst conversion for the second:

我从不忽略编译器警告——我总是修改代码来解决它们——但上面的警告指出了一个根本问题。简而言之,我可能有...

class MyObj_X {
public:
  MyObj_X();
};

class MyObj_Y {
public:
  MyObj_Y();
  MyObj_Y(const MyObj_X &existing_x);
};

void foo(const MyObj_X &tx);
void foo(const MyObj_Y &ty);

我认为

foo()
的两个重载然后是模棱两可的,因为第二个可以采用
MyObj_Y
隐身从
MyObj_X
的实例构造。我经历了,至少在我的各种坐标对象的情况下,解决了一个对象可以直接从另一个对象构造的问题。我最不想要的就是在没有必要时进行所有的内存复制——我当然不想最终编辑一个临时对象!在上面的示例中,它会强制开发人员根据一些额外的信息进行构建,
MyObj_Y(MyObj_X, int v)
等,我能够通过简单地删除一些默认参数来在提供给
coordCopy()
的对象中完成此操作。

有没有人对如何处理上述情况有“最佳实践”建议?我喜欢能够直接从另一个对象构造一个对象的想法(那个版本的构造函数然后用默认值填充其他细节),但是如果我想将两个对象都提供给单独的特定函数的重载,是否有一个既定的确保编译器能够区分各种函数重载的方法?

c++ constructor overloading
© www.soinside.com 2019 - 2024. All rights reserved.