-2

純粋な仮想関数を作成し、この複数の範囲の出力形式 (int、double、char など) に割り当てたいときに問題が発生します。

以下のコードを書きましたが、それは私が望んでいない抽象クラスを削除した場合にのみ機能します。

私のコード:

enter code here

    //class DynamicArray
          //{
          //    public:
          //        virtual void GetData(unsigned int s, int& d) = 0;
          //        virtual void SetData(unsigned int s, int& d) = 0;
          //};
      
      
      
      class DynamicArrayDouble//: public DynamicArray
      {
          private:
              unsigned int m_Length;
              double* arr;
          public:
              DynamicArrayDouble(unsigned int l)
              {
                  m_Length = l;
                  arr = new double[m_Length];
              }
              void SetParam(unsigned int l)
              {
                  m_Length = l;
                  arr = new double[m_Length];
              }
              void GetData(unsigned int s, double& d)
              {
                  d = arr[s];
              }
              void SetData(unsigned int s, double& d)
              {
                  arr[s] = d;
              }
      };

DynamicArray クラスのコメントを外し、DynamicArrayDouble がそれを継承すると、エラーが発生します。最初に Set および Get メソッドの 2 番目のパラメーターに void* を使用しようとしましたが、このコード スタイルを次のように使用できないというエラーが再び表示されます: エラー: 変数 'd1' を宣言できません。抽象型「DynamicArrayDouble」の

上記のエラーのコードは次のとおりです。

    class DynamicArray
    {
        public:
            virtual void GetData(unsigned int s, void* d) = 0;
            virtual void SetData(unsigned int s, void* d) = 0;
    };
    
    class DynamicArrayDouble: public DynamicArray
    {
        private:
            unsigned int m_Length;
            double* arr;
        public:
            DynamicArrayDouble(unsigned int l)
            {
                m_Length = l;
                arr = new double[m_Length];
            }
            void SetParam(unsigned int l)
            {
                m_Length = l;
                arr = new double[m_Length];
            }
        void GetData(unsigned int s, double* d)
        {
            *d = arr[s];
        }
        void SetData(unsigned int s, double* d)
        {
            arr[s] = *d;
        }
    };
    
    int main()
    {
        DynamicArrayDouble d1(5);
        double x=0;
    
        for(unsigned int i=0;i<5;i++)
        {
            x = ((i+1.0)/2);
            d1.SetData(i,&x);
        }
    
        for(unsigned int i=0;i<5;i++)
        {
            d1.GetData(i,&x);
            cout << "Data " << i+1 << " is = " << x << endl;
        }
    
        return 0;
    }

私は自分のコードをコードブロックに書きます。

私はあなたの答えに感謝します...ありがとう。

4

1 に答える 1

0

単純にオーバーライドすることはできません

void func(some_pointer_type ptr);

void func(some_other_pointer_type ptr);

参照についても同様です。それらが一致しない場合、それらは実際には完全に無関係であると見なされます。

DynamicArrayDouble- この名前は、テンプレートを調べる必要があり、必要なすべての型に対して同じコードを記述しないことを示しています。これがSTLの仕組みです。ランタイム ポリモーフィズムを完全に回避できます。

手始めに:

template <typename T>
DynamicArray;
于 2016-07-30T08:11:38.930 に答える