超载<&书信电报;运算符返回错误的值(C+;+;) 我是一个初学者,谈到C++,最近我的小程序遇到了一个非常令人沮丧的问题,我正在练习操作符重载和模板。

超载<&书信电报;运算符返回错误的值(C+;+;) 我是一个初学者,谈到C++,最近我的小程序遇到了一个非常令人沮丧的问题,我正在练习操作符重载和模板。,c++,c++11,C++,C++11,我创建了一个名为SortedVector的模板类,它可以存储各种类型的实例 using namespace std; template <class T, int size> class SortedVector { public: SortedVector(); bool add(const T& v); T& median(); void sortArray(); void removeLarge(const T&

我创建了一个名为SortedVector的模板类,它可以存储各种类型的实例

using namespace std;

template <class T, int size> class SortedVector {
public:
    SortedVector();
    bool add(const T& v);
    T& median();
    void sortArray();
    void removeLarge(const T& v);
    void print(ostream &os);
    void compexch(T& x, T& y);
    void sortArray(T* data, int s);

private:
    T arr[size];
    int arraySize;
};

template <class T, int size> SortedVector<T, size>::SortedVector() {


    arraySize = 0;

    for (int i = 0; i < size; i++) {
        arr[i] = T();
    }
}

template <class T, int size> bool SortedVector<T, size>::add(const T& v) {

    if (arraySize > size - 1) {
        cout << "Array is full!" << endl;
        return false;
    } else {

        arr[arraySize] = v;
        arraySize++;

        sortArray(arr, arraySize);
    }

    return true;
}

template <class T, int size> void SortedVector<T, size>::sortArray(T* data, int s) {
    for (int i = 0; i < s - 1; i++) {
        for (int j = i + 1; j < s; j++) {
            compexch(data[i], data[j]);
        }
    }
}

template <class T, int size > T & SortedVector<T, size>::median() {

}

template <class T, int size> void SortedVector<T, size>::removeLarge(const T & v) {

}

template <class T, int size> void SortedVector<T, size>::print(ostream & os) {


    for (int i = 0; i < arraySize; i++) {
        cout << arr[i] << endl;
    }
}

template <class T, int size> inline void SortedVector<T, size>::compexch(T& x, T& y) {
    if (y < x) {
        T temp = x;
        x = y;
        y = temp;
    }
}

然而,问题是,对于您发布的代码,重载的问题很清楚,到底出了什么问题

您在此处按值传递多边形:

friend bool operator > (Polygon polygon1, Polygon polygon2);
friend bool operator < (Polygon polygon1, Polygon polygon2);
这意味着将进行复制,并且无法安全复制多边形类。调用这两个函数时都会出现内存泄漏和错误

应实现相应的复制构造函数和赋值运算符,其签名为:

Polygon(const Polygon& rhs);  // copy constructor
Polygon& operator=(const Polygon& rhs); // assignment operator
这两项功能都应该实现。有关此信息,请参阅

但是,对于
运算符
,您应该向这些函数传递引用,而不是值:

friend bool operator > (Polygon& polygon1, Polygon& polygon2);
friend bool operator < (Polygon& polygon1, Polygon& polygon2);
一旦实现了这些函数,再加上调用
delete[]
的析构函数,您就不会再有复制对象的问题了


其他问题:

此外,您实际上应该只重载
就变成:

return !(polygon1 < polygon2) && !(polygon == polygon2);  // <-- this can be further improved by implementing operator !=

返回!(polygon1std::vector
而不是尝试编写动态数组类。如果可以,我会这样做,但是这是一个更大的作业的一部分,作为学生,我们必须编写提供std::vector提供的功能的类(我认为这是为了让我们更好地理解类)不幸的是,您提供的代码片段不允许重现您的问题,因此获得帮助的机会很小:我们最多只能猜测代码未知部分的错误。1.您可以在保留问题的同时尽量减少代码(可能会有帮助)-通常情况下,这个问题在这个过程中已经很明显了。2.或者,你可以选择将你的整个代码上传到某个公共存储库并从这里链接。在
compexch
中有一个副本构造。OP需要一个副本构造函数。令人惊讶的答案,真的为我指明了正确的方向,并且完全正确解释了问题和答案。但是,我在尝试实现复制构造函数和=operator.Polygon.cpp时遇到以下错误:在复制构造函数的Polygon::Polygon(const Polygon&)中“:Polygon.cpp:129:63:错误:无法在初始化时将“int*”转换为“Vertex*”,这是为什么?@Tjernquist1您在复制构造函数的第129行中犯了一个错误。如果无法解决该问题,可能会发布一个新问题(在该问题中,您只需要显示多边形代码,而不需要显示项目的其余部分)我还没有完成这个计划,我太累了,今晚无法做进一步的研究,但我将投票给你的答案,因为你写这个答案的时间和善意。谢谢@PaulcKenzie和其他所有人!我对它的运行感到非常兴奋,我无法入睡,经过一点修补,我把它送到了w太棒了!非常感谢!
var area (1):247.5
var area (2):33.5
{(6029504,0)(5,0)(5,3)}
{(6029504,0)(5,0)(5,3)(4,8)}
{(6029504,0)(5,0)(5,3)(4,8)(2,10)}
1
3
6
MEDIAN: 1
MEDIAN: {(6029504,0)(5,0)(5,3)}
friend bool operator > (Polygon polygon1, Polygon polygon2);
friend bool operator < (Polygon polygon1, Polygon polygon2);
if (y < x) {
    T temp = x;  // copy constructor
    x = y;  // assignment
    y = temp;  // assigment
}
Polygon(const Polygon& rhs);  // copy constructor
Polygon& operator=(const Polygon& rhs); // assignment operator
friend bool operator > (Polygon& polygon1, Polygon& polygon2);
friend bool operator < (Polygon& polygon1, Polygon& polygon2);
Polygon::Polygon(const Polygon& rhs) : vertices(new int[rhs.arraySize]), 
                                       arraySize(rhs.arraySize)
{
   for (int i = 0; i < arraySize; ++i)
      vertices[i] = rhs.vertices[i];
}
Polygon& operator=(const Polygon& rhs)
{
    Polygon temp(rhs);
    std::swap(temp.arraySize, arraySize);
    std::swap(temp.vertices, vertices);
    return *this;
}
return !(polygon1 < polygon2) && !(polygon == polygon2);  // <-- this can be further improved by implementing operator !=