簡體   English   中英

在另一個類構造函數中初始化一個類對象

[英]Initialize a class object inside the other class constructor

我是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構造函數中,我可以輕松地將整數值分配給區域。

一個問題是我被賦予了一個字符串,用於將其分配給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);

 }

我的目的是訪問Circle區域值和Circle對象區域值。 最后我寫了函數const Box&getBoxArea()const; 像這樣:

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

結果我得不到正確的值。 我在這里錯過了什么?

Circle構造函數中,您正在嘗試創建Box的實例,這已經太晚了,因為在構造函數的主體執行時, Circle的成員已經構造。 Class 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)) { }
    ...
}

我建議編寫一個非成員函數,根據輸入字符串計算int ,然后在Circle的構造函數初始化列表中使用它。

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

然后

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

您只能初始化初始化列表中的非靜態數據成員。 進入構造函數體后,所有內容都已為您初始化,您所能做的就是對數據成員執行修改。 所以如果Box有一個默認的構造函數,你的代碼的一個變種就是

Circle :: Circle(int area, string str) : area(area)
{
  // calculate int_str
  ....
  box = Box(int_str);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM