提供(可选)功能和封装之间的冲突?

时间:2010-09-23 16:50:53

标签: c++ oop function

我需要对班级Foo的元素提供某种操作。这个操作是特定的,很奇怪,我真的不想让它成为一个成员函数。另一方面,它适用于类的内部,我不想公开。

这是班级:

class Foo {
  typedef std::map<int,double> VecElem;
  std::vector<VecElem> vec_;
 public:
  void Insert(std::size_t index0, int index1, double d);
  // ... other essential functions
};

void Foo::Insert(std::size_t index0, int index1, double d) {
  vec_[index0][index1] = d;
}

我需要支持的操作是根据给定的旧到索引映射将到目前为止插入的每个元素的index1映射到新索引:

void MapIndex1(const std::map<std::size_t,std::size_t>& old_to_new);

鉴于Foo当前如何存储其元素,这意味着内部数据的完全重组,但这不应该暴露给用户。但它也不应该是一个成员函数。

这是friend非成员函数的典型案例吗?还有其他可能性吗?我真的不喜欢friend非成员函数的概念,因为这个奇怪的函数(可能只是暂时需要作为某些问题的解决方法)仍然需要在“官方”类中提及身体(应该永远不会改变)。但我想我无法解决这个问题?

2 个答案:

答案 0 :(得分:0)

要完成这项工作的公共嵌套类怎么样?然后它可以有一个MapIndex1函数,可以自动获得对其封闭类的私有成员的访问权限。完成后,只需删除嵌套类。

class Foo {
// ...
public:
  void Insert(std::size_t index0, int index1, double d);
  // ... other essential functions
  class Remapper
  {
  public:
    Remapper(Foo& foo) : foo_(foo) { }
    void MapIndex1(const std::map<std::size_t,std::size_t>& old_to_new);
  private:
    Foo& foo_;
  };
};

Foo myFoo;
Foo::Remapper remapper(myFoo);
remapper.MapIndex1(...);

答案 1 :(得分:-1)

处理这种情况的想法是添加一个函数,如:

void Ioctl(int func, void* params);给你的班级。然后,此功能可用作所有这些hackey临时场景的网关。然后,当需求消失而不破坏兼容性时,可以安全地删除它们(除非当然有人非正式地使用它们)。

确实你确实失去了类型安全,但它确实为所有这些问题提供了一个很好的瑞士军刀方法。

在内部,您可以定义某些整数函数值来调用函数,并将params值转换为您需要的任何值。