一种使用不同风格的私有成员的方法

A method using different flavors of it's own private members

本文关键字:风格 方法 成员 一种      更新时间:2023-10-16
class A{
private:
  std::vector<class X> flavor1
  std::vector<class X> flavor2
public:
  void useVectorOfX(std::vector<class X> someflavor){
      ...  // same logic for both flavors
  }    
}

现在我想从另一个类调用useVectorOfX(),根据需要给它flavor1flavor2。我能想到三种方法——

方法1:使用Getter方法;但是CCD_ 4通过Getter方法获得自己的数据似乎是不自然的。

class B{
public:
  A *a = new A();
  a->useVectorOfX(a->getFlavor1());
}

方法2:使两个矢量public((

方法3:分开的方法?

class B{
public:
  A *a = new A();
  a->useVectorOfXForFlavor1();
  a->useVectorOfXForFlavor2();
}

采用更具描述性的格式的方法1:

class A {    
public:
    enum {
        flavor1 = 0, // used as array index, first element must be zero
        flavor2,
    } vector_flavor;
    static const int number_of_flavors = 2;
    void useVectorOfX(vector_flavor flav){
        std::vector<class X> someflavor& = vectors[flav];
        // ...
    }
private:        
    std::vector<class X> vectors[number_of_flavors];
}
A object; // lol
object.useVectorOfX(A::flavor1);

我会选择选项3。使用

void useVectorOfXForFlavor1(){
    useVectorOfX(flavor1);
}    

似乎完全合理。

之类的东西怎么样

std::vector<class X> flavors[2];
...
public:
  void useVectorOf(int X) { useVectorOf(flavors[X]); }
private:
  void useVectorOf(std::vector<class X> &v) { ...; }

使用enum而不是普通的int会更好。

使用

class B{
public:
  A *a = new A();
  a->useVectorOfX(a->getFlavor1());
}

这样做更好,因为您只创建了一个方法,并且不会不必要地公开类的成员。

您已经得到了所有技术上正确的答案,但这里真正的问题是接口设计,所以我想解决这个问题。

首先,将对象自己的私有数据作为参数传递它自己的方法是。。。好吧,至少可以说很奇怪。似乎您正试图通过向用户公开内部实现的详细信息来解决一个低级问题,并使用户依赖于任何内部更改。

我的第一个问题是"useVectorOfX方法真的设计用于任何vector<X>吗?

  • :您可能应该有两种方法,doSomething(const vector<X>& clientsData)doSomething() // using your private data

  • no:第二个问题:"从用户的角度来看,这(语义上,而不是代码上(是同一个操作吗?"?

    • :使用一种带有修饰符的方法,如@nightcracker,例如doSomething(A::highPrecision)
    • :按@neneneba博使用2种方法。这将允许您在未来以用户透明的方式更改内部实现