[英]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.