3

次のクラスと 2 つのオブジェクト定義を取ります。

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());

前の 2 つのコンストラクターには、これらのダミー パラメーターが存在しない場合に発生する呼び出しのあいまいさを解決するためのダミーの列挙型パラメーターがあります。ここで名前付きコンストラクターを使用する可能性があるにもかかわらず、これらのダミーパラメーターを使用することを主張する場合、これは私が知っておくべきコーディング規則に違反しますか?

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 に答える