C++ 什么';我的接线员有什么问题;自定义向量类的定义?

C++ 什么';我的接线员有什么问题;自定义向量类的定义?,c++,class,operator-overloading,C++,Class,Operator Overloading,我正在做一个用于教育目的的自定义向量类,但我无法正确使用运算符+。它在返回值后触发断点,但我不知道为什么,可能是析构函数或构造函数,我不知道 罕见的是,当我将操作符+更改为返回T而不是向量,并返回thiscpy.\u els[I]时,程序运行正常。这就是为什么我认为问题可能来自构造函数/析构函数 无论如何,这里是向量的相关部分。h: #include <initializer_list> #include <functional> typedef size_t SIZE

我正在做一个用于教育目的的自定义向量类,但我无法正确使用运算符+。它在返回值后触发断点,但我不知道为什么,可能是析构函数或构造函数,我不知道

罕见的是,当我将
操作符+
更改为返回
T
而不是
向量
,并返回
thiscpy.\u els[I]
时,程序运行正常。这就是为什么我认为问题可能来自构造函数/析构函数

无论如何,这里是向量的相关部分。h:

#include <initializer_list>
#include <functional>

typedef size_t SIZE;

template <class T>
class Vector {
private:
    SIZE _sz;
    T *_els;
public:

    typedef std::function<void(Vector*)> sorting_function;

    static const void populateVector(Vector*, const SIZE&, typename Vector<T>::sorting_function, const bool& sameLength = false);

    Vector(SIZE sz = 0) : _sz(sz), _els(nullptr) {}
    Vector(SIZE, const T&);
    Vector(std::initializer_list<T>);
    Vector(const Vector&);
    Vector(Vector&& vec) : _sz(vec._sz), _els(vec._els) { delete[] vec._els; }

    ~Vector() { delete[] _els; }

    Vector& operator=(const Vector&);
    Vector& operator=(Vector&&);
    Vector& operator=(std::initializer_list<T>);
    Vector operator+(const Vector&);

    SIZE size() const { return _sz; }
    T* elems() const { return _els; }

    int *begin() { return &_els[0]; }   //  for (auto i : Vector) {}
    int *end() { return &_els[_sz]; }   //
};
#include <stdexcept>
#include "Vector.h"


template <class T>
Vector<T>::Vector(const Vector& vec) {
    cout << "Vector initializer" << endl;
    if (this != &vec) {
        populateVector(this, vec._sz, [&](Vector<T>* obj) {
            for (SIZE i = 0; i < vec._sz; i++)
                obj->_els[i] = vec._els[i];
        });
    }
}

template <class T>
Vector<T>& Vector<T>::operator=(const Vector<T>& vec)
{
    cout << "Operator = const" << endl;
    populateVector(this, vec._sz, [&](Vector<T>* obj) {
        for (SIZE i = 0; i < vec._sz; i++)
            obj->_els[i] = vec._els[i];
    }, true);

    return *this;
}

template <class T>
Vector<T>& Vector<T>::operator=(Vector<T>&& vec)
{
    cout << "Operator = move" << endl;
    populateVector(this, vec._sz, [&](Vector<T>* obj) {
        for (SIZE i = 0; i < vec._sz; i++)
            obj->_els[i] = vec._els[i];
    });

    delete[] vec._els;

    return *this;
}

template <class T>
Vector<T>& Vector<T>::operator=(std::initializer_list<T> list)
{
    populateVector(this, list.size(), [&](Vector<T>* obj) {
        SIZE i = 0;
        for (T elem : list)
            obj->_els[i++] = elem;
    });

    return *this;
}

template <class T>
Vector<T> Vector<T>::operator+(const Vector<T>& vec)
{
    cout << "Operator + const" << endl;
    Vector<T> thiscpy(*this);

    if (_sz != vec._sz) throw std::runtime_error("Vector size mismatch");

    for (SIZE i = 0; i < _sz; i++)
        thiscpy._els[i] += vec._els[i];

    return thiscpy;
}

template <class T>
const void Vector<T>::populateVector(Vector<T>* obj, const SIZE& newsize, typename Vector<T>::sorting_function repopf, const bool& sameLength = false)
{
    cout << "Pupulate vector" << endl;
    if (sameLength && (obj->_sz != newsize)) throw std::runtime_error("Incompatible vector length");

    obj->_sz = newsize;
    try
    {
        if (obj->_els != nullptr) delete[] obj->_els;
        obj->_els = new T[newsize];

        repopf(obj);
    }
    catch (const std::exception& e)
    {
        obj->_sz = 0;
        obj->_els = nullptr;
        throw std::runtime_error("Couldn't populate vector");
    }
}
int main() {

    Vector<int> v1{ 1,2,3,4 };     //Vector<T>::Vector(std::initializer_list<T>);
    Vector<int> v2{ 2,4,8,16 };    //Vector<T>::Vector(std::initializer_list<T>);

    try
    {
        cout << "----------" << endl;
        v1 + v2;                       //Triggers breakpoint
        cout << "----------" << endl;
        cout << "done" << endl;
    }
    catch (const std::exception& e)
    {
        cout << e.what() << endl;
    }

    cin.get();
    return 0;
}

在调用
populateVector
之前,您的复制构造函数从不初始化
els
,因此它可能不是null ptr(也可能是),您正在对成员指针的任何内容调用
delete[]
。这可能会导致未定义的行为。

您的复制构造函数在调用
populateVector
之前从未初始化
els
,因此它可能不是nullptr(也可能是),您正在对成员指针的任何内容调用
delete[]
。这可能会导致未定义的行为。

但我不知道为什么,可能是析构函数或构造函数,-您编写了所有这些非琐碎的代码,却不知道如何调试您编写的代码?您到底为什么
删除[]vec.\u els在移动构造函数中?@πνταῥεῖ 不,你想的是
操作符+=
@PaulMcKenzie no。。。VS给了我errors@TerraPass注释应该注意,您的移动构造函数复制了一个指针,但随后您删除了它的内容<新向量中的code>\u els
是空指针。这不是move应该做的。与其
delete[]vec.\u els
,你只需要
vec.\u els=nullptr
。但我不知道为什么,可能是析构函数或构造函数,-你写了所有这些非平凡的代码,却不知道如何调试你写的代码?你到底为什么
delete[]vec.\u els在移动构造函数中?@πνταῥεῖ 不,你想的是
操作符+=
@PaulMcKenzie no。。。VS给了我errors@TerraPass注释应该注意,您的移动构造函数复制了一个指针,但随后您删除了它的内容<新向量中的code>\u els
是空指针。这不是move应该做的。与其
delete[]vec.\u els
,不如
vec.\u els=nullptr
。此外,智能指针的存在也是有原因的。如果您不确定何时调用
delete
,请使用它们。此外,智能指针的存在也是有原因的。如果您不确定何时调用
delete
,请使用它们。
    Pupulate vector
    Pupulate vector
    ----------
    Operator + const
    Vector initializer
    Pupulate vector