代码之家  ›  专栏  ›  技术社区  ›  AShelly

如何在基构造函数中根据派生类的大小分配数组?

  •  5
  • AShelly  · 技术社区  · 16 年前

    我有一个类的层次结构。基类使用一些可从文件加载(并且在运行时可重新加载)的调优参数。每个派生类可以添加一些附加参数。我正在寻找一种方法,在基本构造函数中分配一个大小正确的参数数组,这样就不必在派生类中取消分配和重新分配。我希望这样,但它不起作用(参数总是有两个元素):

       class Base
       { static int nParms;
         virtual int getNParms() { return nParms;}
         float *parameters;
       public:
         Base() 
         { parameters= new float[this->getNParms()];
           parameters[0] = globalReloadableX;
           parameters[1] = globalReloadableY;
         }
       };
       int Base::nParams =2;
    
       class Derived : public Base
       { static int nParms;
         virtual int getNParms() { return nParms;}
       public:
         Derived() : Base()
         { parameters[2] = globalReloadableZ;
         }
       }
       int Derived::nParams =3;
    

    this question ,但那里的解决方案对我不太管用。 我还尝试在每个类中将参数设置为常规数组:

      class Base
      {  float parameters[2]
        ...
      class Derived : public Base
      {  float parameters[3]
        ...
    

    但这使得派生的数组有两个独立的数组。

    有什么想法吗?

    6 回复  |  直到 8 年前
        1
  •  5
  •   Daniel Earwicker    16 年前

    为什么不将所需的数组大小作为参数传递给基类的构造函数?

    (虚拟函数不调用派生类的原因是因为C++虚拟函数是如何工作的;概念上,在派生类构造函数完成之前,对象的类型仍然是基类。)

        2
  •  2
  •   Ryann Graham    16 年前

    把大小作为一个参数怎么样?

    class Base
    { static int nParms;
      virtual int getNParms() { return nParms;}
      float *parameters;
    public:
      Base(int n = nParams) 
      { parameters= new float[n];
        parameters[0] = globalRelodableX;
        parameters[1] = globalRelodableY;
      }
    };
    int Base::nParams =2;
    
    class Derived : public Base
    { static int nParms;
      virtual int getNParms() { return nParms;}
    public:
      Derived() : Base(nParams)
      { parameters[2] = globalRelodableZ;
      }
    }
    int Derived::nParams =3;
    
        3
  •  2
  •   Harper Shelby damiankolasa    16 年前

    为什么要使用数组?vector将允许您在派生类中使用所需的任意多个参数,而基类不知道(或关心)它需要多少参数。

        4
  •  2
  •   Alastair    16 年前

    您可以按照其他人的建议将其作为构造函数的参数,但也可以将基类作为模板类,并将大小作为参数。这有许多优点,例如不需要在堆上分配阵列:

    template <size_t nParams>
    class Base
    {
        float parameters[nParams];
    public:
        Base()
        { // could use a static_assert(nParams > 1) here...
          parameters[0] = globalRelodableX;
          parameters[1] = globalRelodableY;
        }
    };
    
    class Derived : public Base<3>  // or whatever
    {
    public:
        Derived()
        { parameters[2] = globalRelodableZ; }
    };
    
        5
  •  0
  •   Steve Fallows    16 年前

    我会考虑使用STD::MAP。它可以与base和derived一起增长,而不关心其他使用的参数的数量。键/值对可能更容易管理数字索引,尽管这显然取决于应用程序。

        6
  •  0
  •   Kevin Anderson    16 年前