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

时间:2011-06-18 11:47:36

标签: c++

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方法;但class A通过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();

}

5 个答案:

答案 0 :(得分:4)

以更具描述性的格式表达方式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);

答案 1 :(得分:3)

我会选择选项3.使用

void useVectorOfXForFlavor1(){
    useVectorOfX(flavor1);
}    

似乎非常合理。

答案 2 :(得分:1)

如下:

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

使用enum而非普通int会更好。

答案 3 :(得分:1)

使用

class B{

public:

  A *a = new A();
  a->useVectorOfX(a->getFlavor1());
}

这样做更好,因为你只创建了一个方法而且你不必不必要地破坏类公共成员。

答案 4 :(得分:1)

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

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

我的第一个问题是“useVectorOfX方法 真的 是否适用于任何 vector<X>

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

  • 没有:第二个问题:“这是( 语义 ,从用户的角度来看,不是代码方式)相同的操作“?

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