Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从继承的对象检索信息_C++_Oop_Inheritance_Operator Overloading - Fatal编程技术网

C++ 从继承的对象检索信息

C++ 从继承的对象检索信息,c++,oop,inheritance,operator-overloading,C++,Oop,Inheritance,Operator Overloading,我试图实现一个继承对象的层次结构,从简单到复杂,这样做的方式使对象具有尽可能多的面向对象的特性,但我认为这项工作可以在许多方面得到改进。任何建议都是非常受欢迎的。特别是,我不知道如何以安全的方式使用继承功能来解决以下问题: 对象原子包含一个对象向量BasisFunction,它是从更简单的对象收缩中继承的。但在Atom中,我需要获得包含在每个基本函数的向量zeta和C中的信息。如何对此进行修改以使其成为可能 层次结构中的所有对象都可以复制吗?如何引入面向对象的功能 最后我想要一个分子单态。如何定

我试图实现一个继承对象的层次结构,从简单到复杂,这样做的方式使对象具有尽可能多的面向对象的特性,但我认为这项工作可以在许多方面得到改进。任何建议都是非常受欢迎的。特别是,我不知道如何以安全的方式使用继承功能来解决以下问题:

  • 对象原子包含一个对象向量BasisFunction,它是从更简单的对象收缩中继承的。但在Atom中,我需要获得包含在每个基本函数的向量zeta和C中的信息。如何对此进行修改以使其成为可能
  • 层次结构中的所有对象都可以复制吗?如何引入面向对象的功能
  • 最后我想要一个分子单态。如何定义它
  • 我担心这种执行方法的性能。在哪里可以改进
  • 此时,我将显示代码:

    #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?*/
    
    #包括
    #包括
    使用名称空间std;
    使用arma;
    阶级收缩{
    受保护的:
    矢量zeta;
    载体c;
    vec A;
    公众:
    收缩(){}/*构造函数*/
    收缩(向量Zeta,向量C,向量a):Zeta(Zeta),C(C),a(a){
    /*承包商*/
    ~construction(){}/*析构函数*/
    布尔深度复制(施工收缩和rhs){
    bool-bResult=false;
    如果(&rhs!=此){
    这->zeta=rhs.zeta;
    这->c=rhs.c;
    本->A=rhs.A;
    bResult=true;
    }
    返回结果;
    }
    公众:
    收缩(常数收缩和rhs){deepcopy(rhs);}
    收缩和运算符=(常量收缩和rhs){deepcopy(rhs);返回*this;}
    };
    类基本函数:公共压缩{
    受保护的:
    向量n;
    向量l;
    向量m;
    布尔深度复制(常量基本功能和rhs){
    bool-bResult=false;
    如果(&rhs!=此){
    这->zeta=rhs.zeta;
    这->c=rhs.c;
    本->A=rhs.A;
    此->n=右S.n;
    这->l=rhs.l;
    这->m=rhs.m;
    bResult=true;
    }
    返回结果;
    }
    公众:
    BasisFunction(){};/*如何定义此构造函数来初始化继承的元素*/
    ~BasisFunction(){};
    };
    类原子{
    受保护的:
    intz;
    向量R;///位置
    vec P;///动量
    向量F;///力
    双质量;
    向量基;
    公众:
    /*这里我需要定义一个函数,它使用向量基的向量c_I和zeta_I中的信息,它是如何实现的*/
    };
    载体分子/*我需要在一个单件中转换它,如何*/
    
    提前谢谢

  • 如何对此进行修改以使其成为可能?您应该将
    construction
    的受保护字段设置为公共字段,或者将
    construction
    中的Getter/Setter方法设置为访问此文件,或者修改类的所有层次结构,使此字段正好位于需要的位置
  • 层次结构中的所有对象都可以复制吗?如何引入面向对象的功能? 类中没有私有复制构造函数/赋值运算符,并且它们中没有指向数据的原始指针,因此可以安全复制
  • 最后我想要一个分子单态。怎么可能呢 定义 你们不能从向量分子中接收单态,因为这是对象的容器,而不是对象本身。这里不需要单例,因为在作用域中只能有一个名为vector的“分子”。但是,如果您希望signleton保存分子数据,则应向其添加一个类外壳:
  • 类分子
    {
    公众:
    静态分子&Instance(){静态分子实例;返回实例;}
    常量向量&GetMyData()常量{return data;}
    vector&GetMyData(){return data;}
    私人:
    分子(){};
    分子(常量分子和rhs);
    常量分子和运算符=(常量分子和rhs);
    矢量数据;
    
    };可能会更好地问这个问题,您可以使用
    =delete
    来复制构造函数,但我没有看到主题启动程序问题上的C++11标记。将非常量引用返回到
    静态
    变量的原因是什么?您有时可能需要更改数据。因此,Molecule::Instance().GetMyData()将适用于此。如果您有static const Molecule&Instance(),那么这是不可能的。