2013-10-14 171 views
1

我是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構造函數中,我很容易將該整數值分配給區域。

的一個問題是,我給出一個字符串,它分配給框對象

因此,我所做的圈構造內部是:

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區值和圓形對象面積值。 最後我寫了函數const Box & getBoxArea()const;像這樣:

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

因此我沒有得到正確的值。我在這裏錯過了什麼?

+0

您的代碼甚至不應該編譯。 'Box'需要一個默認的構造函數。請張貼一些現實的代碼。 – juanchopanza

+0

[在另一個類對象中初始化一個對象(在對該構造函數進行一些操作之後)]的可能的重複。(http://stackoverflow.com/questions/19345054/initializing-a-object-in-an-another- class-object-after-doing-some-operations-o) – juanchopanza

回答

1

我建議寫一個計算的基礎上,輸入字符串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); 
} 
+0

你是什麼意思的默認構造函數?我想我已經在第一個文件 – user2878007

+0

@ user2878007中有一個Box構造函數,你有一個構造函數'Box(int);'。默認的構造函數沒有參數:'Box();' – juanchopanza

+0

嗯我明白了。我其實沒有一個 – user2878007

3

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)) { } 
    ... 
} 
+0

我看到了,但問題是我沒有默認構造函數 – user2878007

+0

@ user2878007:我指出的解決方案不需要默認構造函數。 – LihO

相關問題