如何使用模板比较两个对象?

时间:2017-11-22 05:58:12

标签: c++ oop c++11

我想比较两个对象,并使用模板在它们之间变大。将对象作为参数传递并不像下面的代码那样工作。请参阅下面给出的示例代码。这就是我想要做的事情。

#include <iostream>
using namespace std;

template <class T>
class max
{
  T a;
  public:
        max(T a)
        {
            this.a = a;
        }
        T Large(T n2)
        {
            return (a > n2.a) ? a : n2.a;
        }
};

int main()
{
  max <int> obj1(10);
  max <int> obj2(20);
  cout<<obj1.Large(obj2)<<" is larger"<<endl;
  return 0;
}

我做了类似的事情,但通过比较2个对象。

// class templates
#include <iostream>
using namespace std;

template <class T>
class mypair {
    T a, b;
  public:
         mypair (T first, T second)
          {a=first; b=second;}
        T getmax ();
};

template <class T>
T mypair<T>::getmax ()
{
  T retval;
  retval = a>b? a : b;
  return retval;
}

int main () {
  mypair <int> myobject (100, 75);
  cout << myobject.getmax();
  return 0;    
}

4 个答案:

答案 0 :(得分:0)

我认为您正在尝试这样做:

template <typename T>
T max(const T &a, const T &b)
{   return (b < a) ? a : b; }

你是怎么做到的。你班上奇怪的杂乱无益是没有任何意义的。因此,如果我得到你想做错的事,请更好地解释自己。

模板不必是您认识的课程。你可以有模板化的功能。

如果您绝对必须使用课程,请执行以下操作:

template <typename T>
class max
{
     T operator ()(const T &a, const T &b) { return (b < a) ? a : b; }
};

int main()
{
    max<int> foo;
    cout << foo(10, 20) << " is larger\n"; // Don't use endl most of the time.
    return 0;
}

假设您有两个不是对象的对象,您会怎么做?好吧,你这样做:

#include <iostream>
#include <algorithm>

struct A {
   int v1;
   int v2;
};

bool operator <(A &a, A &b)
{
     return (a.v1 < b.v1) || ((a.v1 == b.v1) && (a.v2 < b.v2));
}

::std::ostream &operator <<(::std::ostream &os, const A &a)
{
    os << "{" << a.v1 << ", " << a.v2 << "}";
}

int main()
{
    A first{10, 20};
    B second{20, 10};
    ::std::cout << ::std::max(first, second) << " is the larger.\n";
}

如果您不想定义operator <,请执行以下操作:

bool my_less_than(const A &a, const A &b)
{
     return (a.v1 < b.v1) || ((a.v1 == b.v1) && (a.v2 < b.v2));
}

int main()
{
    A first{10, 20};
    B second{20, 10};
    ::std::cout << ::std::max(first, second, my_less_than) << " is the larger.\n";
}

答案 1 :(得分:0)

  

此代码似乎工作正常,如果有帮助,请告诉我

 #include <iostream>
 using namespace std;

 template <class T>
 class Maxi {
             T a;
             public:
                    Maxi(T val)
                    {
                        this->a = val;
                    }
                    T Large(maxi n2)
                    {
                        return (a > n2.a) ? a : n2.a;
                    }
            };

 int main() {
              Maxi <int> obj_1(10);
              Maxi <int> obj_2(20);
              cout<<obj_1.Large(obj_2)<<" is larger"<<endl;
              return 0;
           }

答案 2 :(得分:0)

算法下已经提供了最大和最小模板功能。 只需拨打std::max(10, 20)即可获得两者之间的较大值。

您甚至可以提供自己的比较器进行自定义比较。

旁注:似乎通过包含iostream,你可以在没有算法的情况下使用max和min。

答案 3 :(得分:0)

我看到的问题:

  1. 的使用
    using namespace std;
    

    可能会让你感到困惑,因为std::max会被间接地混入。 g++对我有用。不要使用它。

  2. 以下行中的语法错误:

    this.a = a;
    

    那需要

    this->a = a;
    
  3. Large的参数必须是max类型,而不是T

    为了更好的衡量,我还会将其设为const成员函数。

    T Large(max n2) const
    {
        return (a > n2.a) ? a : n2.a;
    }
    
  4. 使用std::coutstd::endl,因为using namespace std;存在问题。

  5. 以下是您的代码的更新版本,其中包含以上修复程序:

    #include <iostream>
    
    template <class T>
    class max
    {
       private:
          T a;
       public:
          max(T a)
          {
             this->a = a;
          }
    
          T Large(max n2) const
          {
             return (a > n2.a) ? a : n2.a;
          }
    };
    
    int main()
    {
       max <int> obj1(10);
       max <int> obj2(20);
    
       std::cout << obj1.Large(obj2) << " is larger"<<std::endl;
       return 0;
    }
    

    它适用于我并产生以下输出:

    20 is larger