问题描述
|
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()
,根据需要将其指定为flavor1
或flavor2
。我可以想到三种方式-
方式1:使用Getter方法;但是class A
通过Getter方法获取自己的数据似乎是不自然的。
class B{
public:
A *a = new A();
a->useVectorOfX(a->getFlavor1());
}
方法2:使两个向量Make6ѭ(脏)
方式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());
}
这样做会更好,因为您只创建一种方法,并且不必不必要地使类的公共成员cra曲。
, 您已经获得了所有技术上正确的答案,但是这里真正的问题是界面设计,所以我想解决这个问题。
首先,将对象自己的私有数据作为参数传递,它自己的方法……至少可以这样说,这很奇怪。似乎您是在尝试通过向用户公开内部实现的详细信息并使其依赖于任何内部更改来解决底层问题。
我的第一个问题是:“ 14”方法真的设计成可在任何“ 15”上使用吗?
是的:您可能应该有两种方法,16ѭ和doSomething() // using your private data
否:第二个问题:“这是(从用户的角度来看,而不是从代码角度而言)是相同的操作”吗?
是:根据@nightcracker使用一种带有修饰符的方法,例如doSomething(A::highPrecision)
否:按照@Bo使用2种方法。这将允许您将来以用户透明的方式更改内部实现