2017-05-08 96 views
1

我的目標是使類粒子序列化的,問題是:C++使用構造作爲成員函數(對於序列化)

在派生類從istream的讀取時,我可以使用粒子基類的構造函數構件「初始化」功能?

//誤解的可能原因: 我知道我可以編寫setter,但是當代碼塊在Particle的實例上應用訪問運算符時顯示構造函數爲可用成員函數時,我偶然發現了此選項/想法。我從來沒有聽說過這種「遲到」初始化的方式,但我希望它不僅僅是編寫大量的setter ...

所以基本上,這段代碼是正確的嗎?

using namespace std; 

struct Serializable { 
    virtual void write(ostream&) const = 0; 
    virtual void read(istream&) = 0; 
    virtual ~Serializable() {} 
}; 

class Particle { 
    double X, Y; 
public: 
    Particle(double x=0, double y=0) :X(x), Y(y) {} 
    //... 
}; 

class PParticle: Particle, Serializable { 
    //void write... 
    void read(istream& is) { 
     double x, y; 
     cout<<"coord x: "; is>>x; 
     cout<<"coord y: "; is>>y; 
     this->Particle(x, y); //this is the questionable line 
    } 
}; 

如果不是,或者如果我對序列化的想法完全錯誤,有人可能會顯示替代方案,我會非常感謝!

+0

爲什麼不只是'this-> X = x; this-> Y = y;'?你爲什麼要調用構造函數? –

+0

與此同時我只是試了一下,我得到錯誤:無效使用'粒子::粒子'。 爲什麼代碼塊提供構造函數作爲可用的成員函數? – HONDDAACCORD

+0

@CodyGray因爲X和Y是私人的,那就是主要問題 – HONDDAACCORD

回答

2

您提到的行不會編譯。如果你刪除了「this->」它會編譯,但它只是創建一個新的臨時粒子對象,將在函數結束時被銷燬。所以它不會正確設置當前對象的X,Y,它們也不會改變。

一個可能的解決方案是對變量X,Y使用「protected」(如果您不想爲每個變量定義setter)。這樣,PParticle類(以及Particle的所有其他派生類)將能夠訪問和修改它們。

2

不能使用:

this->Particle(x, y); 

語言不允許一個構造函數的對象上已經構造之後被調用。

一種解決方案

Particle添加成員函數中設置xy

class Particle { 
    double X, Y; 
public: 
    Particle(double x=0, double y=0) :X(x), Y(y) {} 

    void setX(double newX) { X = newX; } 
    void setY(double newY) { Y = newY; } 
}; 

PParticle:read中使用它們。

void read(istream& is) { 
    double x, y; 
    is>>x; 
    is>>y; 
    setX(x); 
    setY(y); 
} 

PS

我刪除了線

cout<<"coord x: "; 
    cout<<"coord y: "; 

,因爲他們只是如果你是從cin讀書有用。如果您從文件中讀取PParticle,則它們無用。

相關問題