2017-05-08 2 views
1

내 목표는 수준의 입자가 직렬화하는 것입니다으로 생성자를 사용하여 질문 :C++ (직렬화) 멤버 함수

파생 클래스에서 istream로부터 읽기, 나는 구성원으로 입자의 기본 클래스 '생성자를 사용할 수 있습니다 "초기화"를위한 funtion?

// 가능한 오해의 이유 : 나는 setter를 쓸 수 있지만, codeblocks가 Particle의 인스턴스에 액세스 연산자를 적용 할 때 사용 가능한 멤버 함수로 생성자를 표시 할 때이 옵션/아이디어를 발견했습니다. 이 "늦은"초기화 방법에 대해서는 들어 본 적이 없지만 많은 수의 세터를 쓰는 것보다 더 좋아할 것입니다 ...

기본적으로이 코드가 맞습니까? 내가 대안을 보여줄 수 직렬화 사람의 아이디어에 대해 완전히 틀렸다면, 또는 나는 매우 감사 할 것

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

한편 나는 그것을 시험해 보았고 오류가 발생했다 : 'Particle :: Particle'을 잘못 사용했다. codeblocks가 생성자를 사용 가능한 멤버 함수로 제공하는 이유는 무엇입니까? – HONDDAACCORD

+0

@CodyGray X와 Y는 개인적인 문제이므로 주된 문제입니다 – HONDDAACCORD

답변

2

언급 한 줄은 컴파일되지 않습니다. "this->"를 제거하면 컴파일 될 것이지만, 함수의 끝에서 파기 될 새로운 임시 Particle 객체를 생성합니다. 따라서 현재 객체의 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에서 사용하십시오. 그들은 당신이 cin에서 읽는 경우에만 유용하기 때문에

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

PS 나는 줄

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

를 제거했습니다. 파일에서 PParticle을 읽으면 쓸모가 없습니다.