3

采用以下类和两个对象定义:

class Rect{
 public:
  enum centimeter;
  enum meter;
  Rect(double len,double wid,enum centimeter){
   length=(len/100);
   width=(wid/100);
  }
  Rect(int len,int wid,enum meter){
   length=len;
   width=wid;
  }
  //rest of implementation
 private:
  double length;//in meters
  double width;//in meters
};
Rect obj1(10,5,Rect::centimeter());
Rect obj2(10,5,Rect::meter());

之前的两个构造函数具有虚拟枚举参数,以解决在这些虚拟参数不存在的情况下导致的调用歧义。现在尽管有可能在这里使用命名构造函数,但如果我坚持使用这些虚拟参数,这是否违反了我应该注意的任何编码规则?

4

5 回答 5

10

我认为这违反了我的口味。我会这样编码:

enum Unit {
  Centimeter = 100, 
  Meter      = 1
};

Rect(int len, int wid, Unit unit) {
  length = len / (int) unit;
  width = wid / (int) unit;
}

Rect obj1(10, 5, Rect::Centimeter);
Rect obj2(10, 5, Rect::Meter);
于 2010-07-17T18:59:29.737 回答
4

BOOST_STRONG_TYPEDEF可能是这里的答案。

BOOST_STRONG_TYPEDEF( double, Meter )
BOOST_STRONG_TYPEDEF( double, Centimeters)
BOOST_STRONG_TYPEDEF( double, Furlongs)

class Rect
{
 public:
  Rect(Meter len, Meter wid) : length(len), width(wid) 
  {};

  Rect(Centimeter len, Centimeter wid) : length(len/100), width(wid/100) 
  {};
}

Rect obj1(Meter(10),Meter(5));
Rect obj1(Centimeter(10),Centimeter(5));
于 2010-07-17T21:16:44.810 回答
1

不能说这违反了规则,但是......它不容易阅读。

为什么你不能声明一个

enum metrics {
  centimeter,
  meter
};

并将其用作构造函数参数?或者它可以是

class Rect {
public:
  static Rect CreateWithMeters(int width, int height);
  static Rect CreateWithCentimenets(int width, int height);
}

在我看来,两者都比当前代码更好。

于 2010-07-17T19:01:05.000 回答
1

STL 使用该惯用语来区分迭代器类型而不是概念。

于 2010-07-17T19:02:50.163 回答
0
Rect(int len,int wid,enum centimeter){
  length=(len/100);
  width=(wid/100);
}

除了别人写的,这个逻辑不好,因为Rect(99,99,Rect::centimeter())等于Rect(0,0,Rect::centimeter()).

如果您在内部存储米,请不要提供以厘米为单位的接口,不要以这种方式或任何其他方式。

于 2010-07-17T20:04:56.503 回答