【发布时间】:2016-06-15 03:18:25
【问题描述】:
我想这是一个最佳实践问题。
在 C++ 中,我有一个用于文件系统路径的包装类,类似于 Python 的 os.path。在这个包装类中,有一个名为“Split”的成员函数,它搜索最后出现的路径分隔符并将其拆分为“尾”(路径的最后部分)和“头”(其他所有部分)。按照目前的情况,该函数使用自己的成员变量 m_filepath 进行拆分。
一些代码:
class FilePath {
public:
void Split(FilePath& head, FilePath& tail) const
{
FilePath h;
FilePath t;
//initialize h, t with portions of m_filepath...
head = h;
tail = t;
}
private:
std::string m_filepath;
};
int main(int argc, char ** argv)
{
FilePath some_path_1("/");
FilePath some_path_2("/home/");
some_path_1.Split(some_path_1, some_path_2);
return 0;
}
当我做这样的事情时,some_path_1 的 m_filepath 将被任何“head”所覆盖。 const 运算符似乎也不介意。
我的问题是,处理这个问题的最佳方法是什么?抛出异常?允许覆盖对象(这让我担心,而且听起来不安全)并告诉开发人员要小心?巧妙利用return语句?
【问题讨论】:
-
我认为你不需要做任何事情;如果有人写
some_path_1.Split(some_path_1, some_path_2);,那么您可以假设他们知道他们正在覆盖some_path_1的旧内容。在路径操作中,做这种事情并不少见——就地提取路径的一部分,省去了创建另一个变量的麻烦。 -
只返回一对新路径。它没有什么特别聪明的地方。抛弃输出参数。函数返回其结果。
标签: c++ object reference self mutable