从继承的对象中检索信息

时间:2014-12-17 09:37:47

标签: c++ oop inheritance operator-overloading

我正在尝试实现从简单到复杂的继承对象的层次结构,以这样的方式执行它,即对象具有尽可能多的面向对象的功能,但我填写说,这种努力可以通过多种方式得到改进。任何消化都是非常受欢迎的。特别是我不知道如何使用继承功能,这是一种安全的方法来解决以下问题:

  1. 对象Atom包含一个BasisFunction对象的向量,该对象继承自更简单的对象Contraction。但是在Atom中,我需要访问每个BasisFunction的向量zeta和C中包含的信息。如何修改它以使其成为可能?
  2. 层次结构中的所有对象都是可复制的吗?如何引入对象定向功能?
  3. 最后我想要一个分子单身人士。如何定义?
  4. 我关注这种实施方法的表现。哪里可以改进?
  5. 此时我将展示代码:

    #include <iostream>
    #include <armadillo>
    
    using namespace std;
    using namespace arma;
    
    
    class Contraction{
    protected:
      vector<double> zeta;
      vector<double> c;
      vec A;
    public:
      Contraction(){} /*contructor*/
     Contraction(vector<double> Zeta,vector<double> C, vec a):zeta(Zeta),c(C),A(a){}
     /*contructor*/
      ~Contraction(){} /*destructor*/
    
      bool deepcopy(const Contraction& rhs) {
        bool bResult = false;
        if(&rhs != this) {
          this->zeta=rhs.zeta;
          this->c=rhs.c;
          this->A=rhs.A;
          bResult = true;
        }
        return bResult;
      }
    
     public: 
      Contraction(const Contraction& rhs) { deepcopy(rhs); }
      Contraction& operator=(const Contraction& rhs) { deepcopy(rhs); return *this; }
    
    };
    
    
    class BasisFunction: public Contraction{
     protected:
      vector<int> n;
      vector<int> l;
      vector<int> m;
    
      bool deepcopy(const BasisFunction& rhs) {
        bool bResult = false;
        if(&rhs != this) {
          this->zeta=rhs.zeta;
          this->c=rhs.c;
          this->A=rhs.A;
          this->n=rhs.n;
          this->l=rhs.l;
          this->m=rhs.m;
    
          bResult = true;
        }
        return bResult;
      }
    
     public:
      BasisFunction(){};/*How to define this constructor to initialize the inherited elements too?*/
      ~BasisFunction(){};
    
    };
    
    
    class Atom{
     protected:
      int Z;
      vec R;   ///Position
      vec P;   ///Momentum
      vec F;   ///Force
      double mass;
      vector<BasisFunction> basis;
     public:
      /*Here I need to define a function that uses the information in vectors c_i and zeta_i of the vector basis, how could it be achieved?*/
    };
    
    
    
    vector<Atom> Molecule; /*I nedd transform this in a singleton, how?*/
    

    提前致谢。

1 个答案:

答案 0 :(得分:0)

  1. 如何修改它以使其成为可能?您应该使Contraction的受保护字段成为公共字段,或者在Contraction中创建Getter / Setter方法来访问此文件,或者重写所有类的层次结构,以使这些字段完全位于需要它们的位置。
  2. 层次结构中的所有对象都是可复制的吗?如何引入对象定向功能? 您的类中没有私有的复制构造函数/赋值运算符,它们没有原始指针,因此可以安全地复制它们。
  3. 最后我想要一个分子单身人士。怎么可能     界定? 你不能从矢量Molecule接收单例,因为这是对象的包含而不是对象本身。这里不需要单身,因为你在范围内只能有一个名为“分子”的“分子”。但是,如果你想让signleton保存分子数据,你应该为它添加一个类shell:
  4. class Molecule
    {
    public:
        static Molecule & Instance() { static Molecule instance; return instance; }
        const vector<Atom> & GetMyData() const { return data; }
        vector<Atom> & GetMyData() { return data; }
    private:
        Molecule() {};
        Molecule(const Molecule & rhs);
        const Molecule & operator=(const Molecule & rhs);
            
        vector<Atom> data;
    };
    这是迈耶斯经典的单身实现。

    1. 我关注这种方法的表现     实现。哪里可以改进? 要提高性能,您需要删除处理虚函数调用和间接的每个算法步骤的所有步骤。在你的代码中,它意味着你真的不应该在你的基类中实现get / set方法,因为现在它们是逻辑结构 - 只是有序的数据持有者。如果您经常查看zeta,c和其他字段,则必须直接访问该字段。