为什么叫布尔铸造?

时间:2019-05-09 19:15:25

标签: c++ boolean overloading this operator-keyword

为什么bool演员被称为?

调用构造函数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 个答案:

答案 0 :(得分:5)

复制构造函数Set::Set(Set& copied)的参数不是const引用。运算符Set Set::operator+(const Set& rhs)constconst,因此thisconst Set *,而*thisconst Set。由于您无法将const T传递给T&参数(它将丢弃const),因此您可能无法在这种情况下使用复制构造函数。

要解决此问题,请让您的副本构造函数接受const Set &,就像copy成员函数那样:

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

Edit:强制性的免责声明,您不必编写自己的动态大小的数组。请改用std::vector。它将大大简化您的类型,并且可能会更加安全。

答案 1 :(得分:1)

您可以声明显式转换运算符,以避免隐式转换为bool:

$ chmod 400 ~/anaconda3/KeyPair.pem

$ scp -r -i KeyPair.pem ubuntu@ec2-22-345-22-55.compute-1.amazonaws.com:anaconda3/Data/. D:/Data

然后像这样使用它:

explicit operator bool() const {
    ...
}