[Kstars-devel] KDE/kdeedu/kstars/kstars/skyobjects

Alexey Khudyakov alexey.skladnoy at gmail.com
Wed Jun 3 16:12:01 CEST 2009


SVN commit 977139 by khudyakov:

In this changeset clone function is implemented. It allows safe
copying of objects. E.g. KSPlanet stored as SkyObject* pointer
would be copied as KSPlanet and not sliced. 

For all subclasses of SkyObject but DeepSkyObject copy
constructors are removed. In most cases they are pretty useless
and could be replaced with default implementations. 

* Changes in copy constructors
 - Trail in TrailObject wasn't copied. Now it's copied
 - const annotation added in DeepSkyObject copy constructor

* Overloaded assignment operator in EclipticPosition
  (skyobjects/ksplanetbase.h) removed. Default
  implementation would be just fine too.

Please note, despite the fact that a lot of files are changed
only conjustion tool is affected by this change. Objects of
SkyObject class family are not copied much.

CCMAIL: kstars-devel at kde.org



 M  +6 -1      deepskyobject.cpp  
 M  +3 -1      deepskyobject.h  
 M  +3 -7      ksasteroid.cpp  
 M  +2 -6      ksasteroid.h  
 M  +4 -12     kscomet.cpp  
 M  +2 -6      kscomet.h  
 M  +5 -0      ksmoon.cpp  
 M  +2 -0      ksmoon.h  
 M  +5 -0      ksplanet.cpp  
 M  +2 -0      ksplanet.h  
 M  +0 -8      ksplanetbase.cpp  
 M  +2 -15     ksplanetbase.h  
 M  +5 -0      kspluto.cpp  
 M  +2 -0      kspluto.h  
 M  +5 -0      kssun.cpp  
 M  +2 -0      kssun.h  
 M  +5 -17     skyobject.cpp  
 M  +10 -6     skyobject.h  
 M  +4 -16     starobject.cpp  
 M  +3 -5      starobject.h  
 M  +4 -4      trailobject.cpp  
 M  +2 -6      trailobject.h  


--- trunk/KDE/kdeedu/kstars/kstars/skyobjects/deepskyobject.cpp #977138:977139
@@ -31,7 +31,7 @@
 #include "Options.h"
 #include "skymap.h"
 
-DeepSkyObject::DeepSkyObject( DeepSkyObject &o )
+DeepSkyObject::DeepSkyObject( const DeepSkyObject &o )
         : SkyObject( o ) {
     MajorAxis = o.a();
     MinorAxis = o.b();
@@ -73,6 +73,11 @@
     updateID = updateNumID = 0;
 }
 
+DeepSkyObject* DeepSkyObject::clone() const
+{
+    return new DeepSkyObject(*this);
+}
+    
 void DeepSkyObject::showPopupMenu( KSPopupMenu *pmenu, const QPoint & pos ) {
     pmenu->createDeepSkyObjectMenu( this ); pmenu->popup( pos );
 }
--- trunk/KDE/kdeedu/kstars/kstars/skyobjects/deepskyobject.h #977138:977139
@@ -91,8 +91,10 @@
       *Copy constructor.
     	*@param o SkyObject from which to copy data
     	*/
-    DeepSkyObject( DeepSkyObject &o );
+    DeepSkyObject(const DeepSkyObject &o );
 
+    virtual DeepSkyObject* clone() const;
+    
     /**
     	*Destructor 
     	*/
--- trunk/KDE/kdeedu/kstars/kstars/skyobjects/ksasteroid.cpp #977138:977139
@@ -41,13 +41,9 @@
     P = 365.2568984 * pow(a, 1.5); //period in days
 }
 
-KSAsteroid::KSAsteroid( KSAsteroid &o ) 
-    : KSPlanetBase( (KSPlanetBase &) o ) {
-    setType( 10 );
-    o.getOrbitalElements( &JD, &a, &e, &i, &w, &N, &M );
-    this->H = o.getAbsoluteMagnitude();
-    this->G = o.getSlopeParameter();
-    P = 365.2568984 * pow(a, 1.5); //period in days
+KSAsteroid* KSAsteroid::clone() const
+{
+    return new KSAsteroid(*this);
 }
 
 bool KSAsteroid::getOrbitalElements( long double *_JD, double *_a, double *_e, dms *_i,
--- trunk/KDE/kdeedu/kstars/kstars/skyobjects/ksasteroid.h #977138:977139
@@ -82,12 +82,8 @@
     KSAsteroid( KStarsData *kd, const QString &s, const QString &image_file,
                 long double JD, double a, double e, dms i, dms w, dms N, dms M, double H, double G );
 
-    /**
-     *@short Copy constructor
-     *@param o  Object to make copy of
-     */
-    KSAsteroid( KSAsteroid &o );
-
+    virtual KSAsteroid* clone() const;
+    
     /**Destructor (empty)*/
     virtual ~KSAsteroid() {}
 
--- trunk/KDE/kdeedu/kstars/kstars/skyobjects/kscomet.cpp #977138:977139
@@ -55,18 +55,10 @@
 
 }
 
-KSComet::KSComet( KSComet &o )
-    : KSPlanetBase( (KSPlanetBase &) o ) {
-    setType( 9 ); // Comet
-    kd = KStarsData::Instance();
-    o.getOrbitalElements( &JD, &q, &e, &i, &w, &N );
-    JDp = o.getPerihelionJD();
-    a = q/(1.0 - e);
-    P = 365.2568984 * pow(a, 1.5);
-    H = o.getAbsoluteMagnitude();
-    G = o.getSlopeParameter();
-    setLongName( o.name2() );
-}    
+KSComet* KSComet::clone() const
+{
+    return new KSComet(*this);
+}
 
 bool KSComet::getOrbitalElements( long double *_JD, double *_q, double *_e, dms *_i,
                                   dms *_w, dms *_N ) {
--- trunk/KDE/kdeedu/kstars/kstars/skyobjects/kscomet.h #977138:977139
@@ -66,12 +66,8 @@
     KSComet( KStarsData *kd, const QString &s, const QString &image_file,
              long double JD, double q, double e, dms i, dms w, dms N, double Tp, float H, float G );
     
-    /**
-     *Copy Constructor
-     *@param o  Object to copy into this
-     */
-    KSComet( KSComet &o );
-
+    virtual KSComet* clone() const;
+    
     /**Destructor (empty)*/
     virtual ~KSComet() {}
 
--- trunk/KDE/kdeedu/kstars/kstars/skyobjects/ksmoon.cpp #977138:977139
@@ -37,6 +37,11 @@
     setType( SkyObject::MOON );
 }
 
+KSMoon* KSMoon::clone() const
+{
+    return new KSMoon(*this);
+}
+
 KSMoon::~KSMoon() {
     instance_count--;
     if(instance_count <= 0) {
--- trunk/KDE/kdeedu/kstars/kstars/skyobjects/ksmoon.h #977138:977139
@@ -41,6 +41,8 @@
     	*/
     KSMoon(KStarsData *kd);
 
+    virtual KSMoon* clone() const;
+    
     /**Destructor (empty). */
     ~KSMoon();
 
--- trunk/KDE/kdeedu/kstars/kstars/skyobjects/ksplanet.cpp #977138:977139
@@ -147,6 +147,11 @@
     }
 }
 
+KSPlanet* KSPlanet::clone() const
+{
+    return new KSPlanet(*this);
+}
+        
 // TODO: Get rid of this dirty hack post KDE 4.2 release
 QString KSPlanet::untranslatedName() const {
     if( name() == i18n( "Mercury" ) )
--- trunk/KDE/kdeedu/kstars/kstars/skyobjects/ksplanet.h #977138:977139
@@ -60,6 +60,8 @@
      */
     KSPlanet( KStarsData *kd, int n );
 
+    virtual KSPlanet* clone() const;
+    
     /**
      * Destructor (empty)
      */
--- trunk/KDE/kdeedu/kstars/kstars/skyobjects/ksplanetbase.cpp #977138:977139
@@ -53,14 +53,6 @@
     init( s, image_file, c, pSize );
 }
 
-KSPlanetBase::KSPlanetBase( KSPlanetBase &o ) 
-    : TrailObject( (TrailObject &) o ) {
-    init( o.name(), "", o.color(), o.physicalSize() );
-    Image = *o.image();
-    Image0 = *o.image0();
-    data = KStarsData::Instance();
-}
-
 void KSPlanetBase::init( const QString &s, const QString &image_file, const QColor &c, double pSize ) {
     if (! image_file.isEmpty()) {
         QFile imFile;
--- trunk/KDE/kdeedu/kstars/kstars/skyobjects/ksplanetbase.h #977138:977139
@@ -47,15 +47,8 @@
 
     /**Constructor. */
     explicit EclipticPosition(dms plong = 0.0, dms plat = 0.0, double prad = 0.0) :
-    longitude(plong), latitude(plat), radius(prad) {}
-
-    /**Assignment operator. Copy all values from the target object. */
-    EclipticPosition &operator=(EclipticPosition &r) {
-        this->longitude = r.longitude;
-        this->latitude = r.latitude;
-        this->radius = r.radius;
-        return *this;
-    }
+        longitude(plong), latitude(plat), radius(prad)
+    {}
 };
 
 /**
@@ -86,12 +79,6 @@
                            const QString &image_file=QString(),
                            const QColor &c=Qt::white, double pSize=0 );
 
-    /**
-     *Copy Constructor. Creates a copy of the given KSPlanetBase object
-     *@param o  Object to be copied
-     */
-    KSPlanetBase( KSPlanetBase &o );
-
    /**
      *Destructor (empty)
      */
--- trunk/KDE/kdeedu/kstars/kstars/skyobjects/kspluto.cpp #977138:977139
@@ -55,6 +55,11 @@
     setPhysicalSize( pSize );
 }
 
+KSPluto* KSPluto::clone() const
+{
+    return new KSPluto(*this);
+}
+
 KSPluto::~KSPluto() {
 }
 
--- trunk/KDE/kdeedu/kstars/kstars/skyobjects/kspluto.h #977138:977139
@@ -51,6 +51,8 @@
     	*/
     explicit KSPluto(KStarsData *kd, const QString &fn=QString(), double pSize=0);
 
+    virtual KSPluto* clone() const;
+    
     /**Destructor (empty) */
     virtual ~KSPluto();
 
--- trunk/KDE/kdeedu/kstars/kstars/skyobjects/kssun.cpp #977138:977139
@@ -31,6 +31,11 @@
     setMag( -26.73 );
 }
 
+KSSun* KSSun::clone() const 
+{
+    return new KSSun(*this);   
+}
+
 bool KSSun::loadData() {
     OrbitDataColl odc;
     return (odm.loadData(odc, "earth") != 0);
--- trunk/KDE/kdeedu/kstars/kstars/skyobjects/kssun.h #977138:977139
@@ -38,6 +38,8 @@
     	*/
     KSSun( KStarsData *kd );
 
+    virtual KSSun* clone() const;
+    
     /**Destructor (empty)
     	*/
     virtual ~KSSun() {}
--- trunk/KDE/kdeedu/kstars/kstars/skyobjects/skyobject.cpp #977138:977139
@@ -41,23 +41,6 @@
 QString SkyObject::unnamedObjectString = QString(i18n("unnamed object"));
 QString SkyObject::starString = QString("star");
 
-SkyObject::SkyObject( SkyObject &o ) : SkyPoint( o ) {
-    setType( o.type() );
-    Magnitude = o.mag();
-    setName(o.name());
-    setName2(o.name2());
-    setLongName(o.longname());
-    info = NULL;
-    if( o.hasAuxInfo() ) {
-        info = getAuxInfo();
-        info->ImageList = o.ImageList();
-        info->ImageTitle = o.ImageTitle();
-        info->InfoList = o.InfoList();
-        info->InfoTitle = o.InfoTitle();
-        info->userLog = o.userLog();
-    }
-}
-
 SkyObject::SkyObject( int t, dms r, dms d, float m,
                       const QString &n, const QString &n2,
                       const QString &lname )
@@ -82,6 +65,11 @@
     info = NULL;
 }
 
+SkyObject* SkyObject::clone() const
+{
+    return new SkyObject(*this);
+}
+
 SkyObject::~SkyObject() {
     delete info;
     info = NULL;
--- trunk/KDE/kdeedu/kstars/kstars/skyobjects/skyobject.h #977138:977139
@@ -71,16 +71,20 @@
                const QString &n=QString(), const QString &n2=QString(), const QString &lname=QString() );
 
     /**
-     *Copy constructor.
-     *@param o SkyObject from which to copy data
-     */
-    SkyObject( SkyObject &o );
-
-    /**
      *Destructor (empty)
      */
     ~SkyObject();
 
+    /** Create copy of object.
+     * This method is virtual copy constructor. It allows for safe
+     * copying of objects. In other words, KSPlanet object stored in
+     * SkyObject pointer will be copied as KSPlanet.
+     * Each subclass of SkyObject MUST implement clone method.
+     *
+     *  @return pointer to newly allocated object. Caller takes full responsibility
+     *  for deallocating it. 
+     */
+    virtual SkyObject* clone() const;
     /**
      *@enum TYPE
      *The type classification of the SkyObject.
--- trunk/KDE/kdeedu/kstars/kstars/skyobjects/starobject.cpp #977138:977139
@@ -57,22 +57,6 @@
     return 25.0 * 60.0 * 10.0 / pm;
 }
 
-StarObject::StarObject( StarObject &o )
-        : SkyObject (o)
-{
-    SpType[0] = o.SpType[0];
-    SpType[1] = o.SpType[1];
-    //SONAME: deprecated (?) JH
-    //  soName = o.soName;
-    PM_RA = o.pmRA();
-    PM_Dec = o.pmDec();
-    Parallax = o.parallax();
-    Multiplicity = o.isMultiple();
-    Variability = o.isVariable();
-    HD = o.getHDIndex();
-    updateID = updateNumID = 0;
-}
-
 StarObject::StarObject( dms r, dms d, float m,
                         const QString &n, const QString &n2,
                         const QString &sptype, double pmra, double pmdec,
@@ -131,6 +115,10 @@
     updateID = updateNumID = 0;
 }
 
+StarObject* StarObject::clone() const
+{
+    return new StarObject(*this);
+}
 
 void StarObject::init( const starData *stardata ) 
 {
--- trunk/KDE/kdeedu/kstars/kstars/skyobjects/starobject.h #977138:977139
@@ -44,15 +44,11 @@
 class StarObject : public SkyObject {
 public:
 
-    /* @short returns the reindex interval (in centuries!) for the given
+    /** @short returns the reindex interval (in centuries!) for the given
      * magnitude of proper motion (in milliarcsec/year).  ASSUMING a 
      * 25 arc-minute margin for proper motion.
      */
     static double reindexInterval( double pm );
-    /**
-        *Copy constructor
-        */
-    StarObject(StarObject & o);
 
     /**
         *Constructor.  Sets sky coordinates, magnitude, latin name, genetive name, and
@@ -93,6 +89,8 @@
                 const QString &n2=QString(), const QString &sptype="--", double pmra=0.0, double pmdec=0.0,
                 double par=0.0, bool mult=false, bool var=false, int hd=0 );
 
+    virtual StarObject* clone() const;
+    
     /**
      * Destructor. (Empty)
      */
--- trunk/KDE/kdeedu/kstars/kstars/skyobjects/trailobject.cpp #977138:977139
@@ -26,11 +26,11 @@
   : SkyObject( t, r, d, m, n )
 {}
 
-TrailObject::TrailObject( TrailObject &o ) 
-    : SkyObject( (SkyObject &) o )
-{}
+TrailObject* TrailObject::clone() const
+{
+    return new TrailObject(*this);
+}
 
-
 void TrailObject::updateTrail( dms *LST, const dms *lat ) {
     for ( int i=0; i < Trail.size(); ++i )
         Trail[i].EquatorialToHorizontal( LST, lat );
--- trunk/KDE/kdeedu/kstars/kstars/skyobjects/trailobject.h #977138:977139
@@ -41,13 +41,9 @@
      */
     TrailObject( int t, double r, double d, float m=0.0, const QString &n=QString() );
 
+    virtual TrailObject* clone() const;
+    
     /**
-     *Copy constructor.
-     *@param o SkyObject from which to copy data
-     */
-    TrailObject( TrailObject &o );
-
-    /**
      *@return whether the planet has a trail
      */
     inline bool hasTrail() const { return ( Trail.count() > 0 ); }


More information about the Kstars-devel mailing list