Почему bool casting называется? - PullRequest
0 голосов
/ 09 мая 2019

Почему вызывается bool casting?

Проблема возникает, когда вызывается конструктор Set result(*this).Я ожидаю, что он будет использовать конструктор копирования, вместо этого он преобразует *this в bool и использует его как int для конструктора.

Как это исправить, чтобы использовать конструктор копирования?

Set Set::operator+(const Set& rhs)const
{
    Set result(*this);

    for (unsigned int i = 0; i < rhs.getSize(); i++)
    {
        result.add(rhs[i]);
    }
    return result;
}

Set::operator bool()const
{
    return !!(*this);
}

Set::Set(size_t capacity)
{
    data = new int[capacity];
    size = 0;
    this->capacity = capacity;
}

void Set::copy(const Set& copied)
{
    size = copied.getSize();
    capacity = copied.getCapacity();
    if (data != nullptr)
        delete[]data;
    data = new int[capacity];
    for (unsigned int i = 0; i < size; i++)
        data[i] = copied.getAt(i);
}

Set::Set(Set& copied)
{
    copy(copied);
}

Set& Set::operator=(const Set& copied)
{
    if (this != &copied)
        copy(copied);
    return *this;
}

int& Set::getAt(unsigned int idx)const
{
    if (idx < 0 || idx >= size)
        throw "Invalid index\n";

    return data[idx];
}

bool Set::operator !()const
{
    if (size == 0)
        return true;
    return false;
}

Ответы [ 2 ]

5 голосов
/ 09 мая 2019

Аргумент для вашего конструктора копирования Set::Set(Set& copied) не является ссылкой const.Оператор Set Set::operator+(const Set& rhs)const равен const, поэтому this равен const Set *, а *this равен const Set.Поскольку вы не можете передать const T аргументу T& (он бы отбросил const), вы не можете использовать конструктор копирования в этом контексте.

Чтобы это исправить, создайте конструктор копированиявместо этого принимайте const Set &, так же как и функция-член copy:

Set::Set(const Set& copied)
//       ^^^^^ Added const here
{
    copy(copied);
}

Редактировать: Обязательный отказ от ответственности, что вам не нужно писать свой собственный динамически изменяемый массив.Вместо этого используйте std::vector.Это значительно упростит ваш тип и, вероятно, будет намного безопаснее.

1 голос

Вы можете объявить оператор приведения явным образом, чтобы избежать неявного приведения к bool:

explicit operator bool() const {
    ...
}

И затем использовать его следующим образом:

Set::bool(//obj_name);
...