0

次のシナリオがあります:

class num {
    public:
    void print(ostream* o); // Prints the n variable
};

class int_num : public num{
    public:
    int n; // Initialized by this class's constructor
};

class float_num : public num{
    public:
    float n; // Initialized by this class's constructor
};

class double_num : public num{
    public:
    double n; // Initialized by this class's constructor
};

このようなスキームを実装するにはどうすればよいですか

4

4 に答える 4

4

派生型で実装される仮想メソッドを指定します。

class num {
 public:
    void print(ostream& o) const
    {  // Prints the n variable
      doPrint(o);
    }
 private:
    virtual void doPrint(ostream& os) const = 0;
};

class double_num : public num{
  public:
    double n; // Initialized by this class's constructor
 private:
  void doPrint(ostream& os) const 
  {
    os << n;
  }
};
于 2013-01-22T16:24:53.077 に答える
2

使用しない理由template:

template<typename T>
class num
{
    T n;  //data of type T

 public:

      //add constructor(s) to initialize n

      void print(std::ostream &out) { out << n ; }

      //add functions(s) to work with n
};

それは印刷を行うことができます。

次の 2 つのオプションがあります。

  • typedefコード内のすべての派生型が同じことを行っている場合に使用します。型固有のものはありません。

    //use typedefs
    typedef num<int>    int_num; 
    typedef num<float>  float_num; 
    typedef num<double> double_num;
    
  • または、派生クラスで固有のことを行う必要がある場合は、継承を使用します。

    class int_num : public num<int>
    {
       //int specific things 
    };
    

ポイントは、使用するか継承num<T>するかに関係なく、印刷を行うことができるということです。typedef

于 2013-01-22T16:25:38.877 に答える
1

2 つのオプションがあります。

1つはprint()、他の人がすでに指摘しているように、純粋な仮想を作成して派生クラスに実装することです。

もう 1 つのオプションは、次のようにCuriously recurring テンプレート パターンを使用することです。

template <typename Impl>
class num
{
public:
  void print(ostream &os) const
  {
    os << static_cast<const Impl*>(this)->n;
  }
};

class int_num : public num<int_num>
{
  //same as before
};

class float_num : public num<float_num>
{
  //same as before
};

//etc.
于 2013-01-22T16:28:19.307 に答える
0

解決策は 2 つあります。1 つ目は、printメソッドを純粋な抽象メソッドにして、すべての子クラスに実装することです。2 つ目は、テンプレートを使用することです。

template<typename T>
class num
{
public:
    void print(std::ostream& os) const
        {
            os << num_;
        }

private:
    T num_;
};

typedef num<float> float_num;
typedef num<int>     int_num;
于 2013-01-22T16:25:07.923 に答える