Автоматическое преобразование типов для пользовательского класса Vector?

0

Я перегрузил оператор "+" для моего класса Vector как показано ниже. Теперь в основной программе я использую этот оператор в двух случаях:

  1. Второй аргумент operator+ - это std::vector вместо объекта Vector. Я не понимаю, почему вызывается 2-й конструктор или почему вызван деструктор, и кажется, что std::vector автоматически преобразуется в объект Vector.

  2. Второй аргумент operator+ - это Vector объект. Я не понимаю, почему вызывается второй конструктор.

Благодарю.

vector.h:

#include <iostream>
#include <vector>
#include <assert.h>
#include <functional>  // plus
#include <algorithm>  // transform
#include <iterator>  // back_inserter

class Vector
{
private:
    std::vector<int> base;

public:
    Vector();  // dflt ctor
    Vector(const std::vector<int> vec);  // 2nd ctor
    Vector(const Vector& vec);  // copy ctor
    ~Vector();
    Vector& operator=(const Vector& rhs);
    Vector operator+(const Vector& rhs);
    void getBase();
};

Соответствующие определения в Vector.cpp:

Vector::Vector(const std::vector<int> vec)
{
    std::cout << "2nd ctor \n";
    if(vec.empty())
    {
        base.push_back(0);
    }
    else
    {
        base = vec;
    }
}

Vector Vector::operator+(const Vector& rhs)
{
    assert( base.size() == rhs.base.size() );

    std::vector<int> result;
    result.reserve(base.size());
    std::transform(base.begin(), base.end(), rhs.base.begin(), std::back_inserter(result), std::plus<int>());

    return result;
}

Vector::~Vector()
{
    std::cout << "dtor \n";
}

main.cpp:

#include "Vector.h"

int main()
{
    int arr1[] = {1,2,3,4,5};
    int arr2[] = {10,20,30,40,50};

    std::vector<int> vec1 (arr1, arr1 + sizeof(arr1) / sizeof(arr1[0]));
    std::vector<int> vec2 (arr2, arr2 + sizeof(arr2) / sizeof(arr2[0]));

    Vector v1(vec1);
    Vector v2(vec2);

    std::cout << "\n Case 1: \n";
    Vector v3 = v1 + vec2;

    std::cout << "\n Case 2: \n";
    Vector v4 = v1 + v2;

    // program is paused here, so remaining destructors don't show in output
}

Вывод:

2nd ctor
2nd ctor

 Case 1:
2nd ctor
2nd ctor
dtor

 Case 2:
2nd ctor
Теги:
type-conversion
vector
destructor

1 ответ

1
Лучший ответ

Прежде всего позвольте мне отметить, что есть причина, по которой стандартная библиотека не имеет operator+ для vector: она не интуитивно понятна, что она должна делать. Должен ли он добавить два вектора? Добавьте соответствующие элементы? Секретный вариант 3? Даже если это "очевидно" для вас, это не будет очевидно для людей, которые должны поддерживать ваш код в будущем. Гораздо лучший подход - это просто называемые методы или бесплатные функции.

Тем не менее, причина, по которой вы получаете дополнительные вызовы ctor2 и dtor в случае 1, состоит в том, что во-первых, ваш параметр является std::vector но вашему оператору требуется Vector поэтому единственный способ вызвать + - преобразовать std::vector в Vector. Затем внутри оператора вы создаете std::vector чтобы заполнить результат, но возвращаемый тип оператора Vector поэтому результат должен быть преобразован в оператор return.

Для случая 2 вы видите дополнительный ctor2 для той же причины return что и в случае 1.

  • 0
    Спасибо, я не понял, что возвращаю std :: vector. Так как же программа узнает, как присвоить vec2 std: vector базовому элементу Vector?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню