2011-04-15 102 views
0

我遇到了一個我無法解決的C++程序中的問題。 我想傳遞一個對象作爲另一個的構造參數,但我無法弄清楚如何做到這一點。對象成員的問題

我的主要工作是創建一個模擬對象。在模擬中,我創建了兩個對象平面和模型。事情是,我想通過模型化對象中的平面對象。

我的第一個對象是模擬。

#include "Simulation.h" 
#include "Modelisation.h" 
#include "Planete.h" 

Planete *Obj; 
Modelisation *Model; 

Simulation::Simulation (int argc, char **argv) 
{ 
    Obj = new Planete ("Terre", (5.98*pow(10.0,24.0)), 6378.137, 0, 0, 0); 
    Model = new Modelisation (argc, argv,"Modelisation",1600 ,1004, 306, 0); 
}; 
Simulation::~Simulation() 
{ 
    delete Obj; 
    delete Model; 
}; 

Modelisation.h

class Modelisation 
{ 
private: 
    int hauteur, largeur, x, y; 
    int fenetre; 
    //Planete ClonePlanete 
public: 
    Modelisation (int argc, char **argv, char[], int, int, int, int); 
    ~Modelisation(); 
    static void Dessiner(); 
    static void Redessiner (int, int); 
    void InitCallBack(); 
}; 

Modelisation.cpp

#include "stdafx.h" 
#include "Modelisation.h" 
#include "Camera.h" 
#include "Planete.h" 

Camera *camera; 

Modelisation::Modelisation (int argc, char **argv, char nomFenetre [] ,int hauteur, int largeur, int x, int y) 
{ 

    glutInit (&argc, argv); 
    glutInitDisplayMode (GLUT_SINGLE); 
    glutInitWindowSize (hauteur, largeur); 
    glutInitWindowPosition (x, y); 
    fenetre = glutCreateWindow (nomFenetre); 
    camera = new Camera; 
// Planete ClonePlanete = new Planete(planete); // Basicaly that's what i'm trying to do 
}; 

Modelisation::~Modelisation() 
{ 
    delete camera; 
}; 

Planete.h

class Planete 
{ 
private: 
    std::string nom; 
    double masse; 
    double diametre; 
    struct position { double x, y, z;}; 
    double x,y,z; 

public: 
    Planete (std::string nom, double masse, double diametre, double x, double y, double z); 
    Planete (const Planete &); 
    ~Planete(); 
}; 

感謝您的幫助,將不勝感激!

+0

這並不完全清楚你在這裏問什麼。究竟是哪條線給你帶來麻煩? – 2011-04-15 15:07:44

+0

您可以嘗試發佈最簡單的代碼示例,該示例不會編譯/工作,可以證明您的問題。我並不是說沒有人會閱讀你的代碼,但這會讓它變得更加困難。 – briantyler 2011-04-15 15:08:24

+0

你說得對,那就是我要做的。 – Athanase 2011-04-15 15:09:51

回答

2

您可以通過在構造函數中不斷引用傳遞則有被初始化像這樣一個私有成員:

Modelisation(const Planete& planRef) : m_planete(planRef)

而且漂亮的法國變量名;)

編輯:

在這裏有一些有趣的設計選擇,你可能想重新考慮全局變量而贊成類成員,支持智能指針而不是動態分配和取消分配傳統方式,並考慮您的對象具有的關係。您的模擬是組合的主要候選對象,您的行星可以在繼續使用繼承和多態性以便稍後使用模型繪製模型時使用。

編輯:我很無聊......

class Planete 
{ 
public: 
    Planete (const std::string& nom, double masse, double diametre, double x, double y, double z) 
     : m_nom(nom), m_masse(masse), m_position(x, y, z) {} 
    virtual ~Planete() {} 

    // default implementation as most planets don't have people 
    virtual unsigned long HumanPopulation() { return 0; } // virtual with default implemenation, each planet can change it 
    virtual double Temp() = 0; // pure virtual each planet must have it's own version 
protected: 
    std::string m_nom; 
    double m_masse; 
    double m_diametre; 
    class Position 
    { 
    public: 
     Position(double x, double y, double z) 
      : x_(x), y_(y), z_(z) {} 
    private: 
     double x_, y_, z_; 
    }; 
    Position m_position; 
}; 

class Terre : public Planete // Earth is a Planet 
{ 
public: 
    Terre(double masse, double diametre, double x, double y, double z) 
     : Planete("Terre", masse, diametre, x, y, z) {} 
    ~Terre() {} 

    // override base class default virtual 
    unsigned long HumanPopulation() { return CalculatePeople(); } 
    double Temp() { /* yata yata */ } 

private: 
    unsigned long CalculatePeople() { /* figure out how many people on earth */ } 
}; 

class Mercure : public Planete // Mecury is also a Planet 
{ 
public: 
    Mercure(double masse, double diametre, double x, double y, double z) 
     : Planete("Mercure", masse, diametre, x, y, z) {} 
    ~Mercure() {} 

    double Temp() { /* tres chaud */ } 
}; 
1

你的意思是這樣的嗎?

Modelisation::Modelisation (int argc, char **argv, char nomFenetre [] , 
int hauteur, int largeur, int x, int y, Planet * planet) 
{ 

}; 


Simulation::Simulation (int argc, char **argv) 
{ 
    Obj = new Planete ("Terre", (5.98*pow(10.0,24.0)), 6378.137, 0, 0, 0); 
    Model = new Modelisation (argc, argv,"Modelisation",1600 ,1004, 306, 0, Obj); 
}; 
1

我不知道你問什麼,但這個工作得很好:

Simulation::Simulation (Planete* planete, Model* model) 
{ 
    Obj = planete; 
    Model = model; 
}; 

其他一些注意事項:

  • ObjModel確實應該在Simulation成員變量,而不是全局變量在你r Simulation.cpp
  • 我認爲它是一個主要的代碼氣味將argc, argv作爲參數傳遞給構造函數。相反,您的main方法應解析命令行參數,然後將解析的值傳遞給構造函數。
0

您需要在這裏更改幾件事情。首先,Planete和Modelisation變量應該是模擬的成員,而不是全局變量。所以,你的模擬聲明是這樣的:

class Simulation 
{ 
public: 
    Simulation(int argc, char **argv); 
    virtual ~Simulation(); 

private: 
    Planete *Obj; 
    Modelisation *Model; 
} 

關於通過你PLANETE對象的Modelisation,你也可以有Modelisation有PLANETE成員如下:

class Modelisation 
{   
    // stuff you already have... 
private: 
    Planete *planete; 
} 

然後你就可以改變你的Modelisation構造採取PLANETE指針,並在構造函數中分配給它:

Modelisation (Planete *p, int argc, char **argv, char[], int, int, int, int) 
{ 
    // Stuff that's already there... 
    planete = p;  
} 

現在你有,因爲你必須確保即將這裏要小心誰擁有Planete,誰應該刪除它。刪除它兩次會導致不好的事情。我建議使用shared_ptr避免在那裏做錯事。