2017-09-15 60 views
-2
class shape{ 
public: 
    shape(string a, bool b):name(new string), moral(new bool){ 
     *name=a; 
     *moral=b; 
    } 
    shape():name(new string),moral(new bool){ 
     *name="shape"; 
     *moral=true; 
    } 
    ~shape(){ 
     delete name; 
     delete moral; 
    } 

protected: 
    string* name; 
    bool* moral; 
}; 


class circle:public shape{ 
public: 
    circle(string s, bool bb, double d):shape(new string, new 
bool),radius(new double){ 


    } 
protected: 
    double * radius; 
}; 

最近,我試圖拿起C++。這是我在學習繼承屬性時編寫的示例代碼。兒童班級圈子的「形狀(新弦,新布爾)」有錯誤顯示。我不確定什麼是正確的語法來做到這一點。另外,我注意到如果在類中使用指針,初始化列表的形式被用來分配內存而不是分配值。有更好的表達方式和語法我可以用來做到這一點嗎?謝謝你們提前。C++中的繼承的正確語法,初始化列表和內存分配?

+3

爲什麼你使用'名:(新字符串)',而不僅僅是'名稱:(一)'? – Barmar

+0

名稱是我創建的指針。對於動態內存,我不應該先分配內存嗎? –

+0

爲什麼你需要它是動態的?爲什麼不只是'string'作爲成員而不是'string *'? – Barmar

回答

1

喜歡交易價值。 C++不像java或c#。避免指針,新的和刪除這種事情。

如果你不寫析構函數,編譯器會給你正確的析構函數。複製並免費移動。

#include <string> 

class shape{ 
public: 
    shape(std::string a, bool b) : name(a), moral(b) 
    { 
    } 
    shape():name("shape"),moral(true){ 
    } 

protected: 
    std::string name; 
    bool moral; 
}; 


class circle:public shape{ 
public: 
    circle(std::string s, bool bb, double d) 
    : shape(s, bb) 
    , radius(d) 
    { 

    } 
protected: 
    double radius; 
}; 

但在現實類我想使用動態內存存儲:

#include <string> 
#include <memory> 

class shape{ 
public: 
    shape(std::string a, bool b) 
    : name(std::make_unique<std::string>(a)) 
    , moral(b) 
    { 
    } 

    shape() 
    : shape("shape", true) 
    { 
    } 

protected: 
    std::unique_ptr<std::string> name; 
    bool moral; 
}; 


class circle:public shape{ 
public: 
    circle(std::string s, bool bb, double d) 
    : shape(s, bb) 
    , radius(d) 
    { 

    } 
protected: 
    double radius; 
}; 
+0

那麼,我知道如何處理值,但指針,這就是爲什麼我問是否有正確和簡單的語法在類中使用動態內存,特別是在處理繼承時。 –

+0

@天元ok將更新以展示帶智能指針的動態內存 –