7

私はC++が初めてです。box.cpp と circle.cpp ファイルがあります。私の問題を説明する前に、その定義を示したいと思います。

box.cppで

  class Box
  {
       private:
       int area;

       public:
       Box(int area);
       int getArea() const;

  }

circle.cpp 内

   #include "box.h"
   class Circle
   {
      private:
      int area;
      Box box;

      public:
      Circle(int area, string str);
      int getArea() const;
      const Box& getBoxArea() const;  

   }

Circle クラスでわかるように、整数値と Box オブジェクトがあります。Circle コンストラクターでは、その整数値を簡単に area に割り当てます。

1 つの問題は、Box オブジェクトに割り当てるための文字列が与えられていることです。

したがって、Circle コンストラクター内で行ったことは次のとおりです。

 Circle :: Circle(int area, string str)
 {
  this->area = area;
  // here I convert string to an integer value
  // Lets say int_str;
  // And later I assign that int_str to Box object like this:
    Box box(int_str);

 }

私の意図は、円の面積値と円のオブジェクト面積値の両方にアクセスすることです。最後に、関数 const Box& getBoxArea() const; を書きます。このような:

  const Box& getBoxArea() const
  {
       return this->box;    
  }

その結果、正しい値が得られません。ここで何が欠けていますか?

4

2 に答える 2

5

のコンストラクターでCircleのインスタンスを作成しようとしていますが、コンストラクターの本体が実行されるまでに のメンバーが既に構築Boxされているため、手遅れです。CircleクラスBoxにはデフォルトのコンストラクターが必要かbox、初期化リストで初期化する必要があります。

Box constructBoxFromStr(const std::string& str) {
    int i;
    ...
    return Box(i);
}

class Circle
{
private:
    int area;
    Box box;

public:
    Circle(int area, string str)
      : area(area), box(constructBoxFromStr(str)) { }
    ...
}
于 2013-10-14T08:10:27.660 に答える
4

int入力文字列に基づいてを計算する非メンバー関数を作成し、それをCircleのコンストラクター初期化リストで使用することをお勧めします。

std::string foo(int area) { .... }

それから

Circle :: Circle(int area, string str) : box(foo(str)) { .... }

初期化リストでは、非静的データ メンバーのみを初期化できます。コンストラクター本体に入ると、すべてが初期化されており、できることはデータ メンバーを変更することだけです。Boxしたがって、デフォルトのコンストラクターがある場合にコンパイルされるコードの1つのバリアントは次のようになります

Circle :: Circle(int area, string str) : area(area)
{
  // calculate int_str
  ....
  box = Box(int_str);
}
于 2013-10-14T08:11:10.700 に答える