赋值运算符重载/检索功能

时间:2014-12-09 00:51:13

标签: c++ oop pointers operator-overloading

我试图从BST中检索项目中的作业。我不允许改变一些提供的代码。教师在驱动程序中创建了一个检索功能(我无法改变),看起来像这样

static void retrieveItem(char *name)
{
    Data    const *data;

    cout << ">>> retrieve " << name << endl << endl;
    if (database->retrieve(name, data))
        cout << *data << endl;
    else
        cout << "not found" << endl;
    cout << endl;
}

它在BST类中调用的函数看起来像这样(到目前为止)。我无法更改函数调用的参数。

bool BST::retrieve(const char *key, Data const *& data) const
{
    int rIndex = 0;
    while (rIndex <= capacity)
    {
        if (strcmp(items[rIndex].data.getName(), key) == 0)
            {
            data = items[rIndex].data;
            return true;
            }
        else if (strcmp(items[rIndex].data.getName(), key) < 0)
            rIndex = (rIndex * 2) + 1;
        else if (strcmp(items[rIndex].data.getName(), key) > 0)
            rIndex = (rIndex * 2) + 2;
    }
    return false;
}

有一个名为items的结构数组,看起来像这样

struct Item
{
    Data    data;       // the data instance must be specified this way, NOT as a pointer
    bool    isEmpty = true;
    int     loc = 0;
};

Item *items;

最后,我为数据类实现了以下赋值重载和复制构造函数(无法在此更改源文件)

Data::Data(const Data& source)
{
    strcpy(this->name, source.name);
}

Data& Data::operator=(const Data& data2)
{
    strcpy(this->name, data2.name);
    return *this;
}

如果我错了,请纠正我,但似乎他在驱动程序中检索函数的目标是使用密钥(名称)搜索数据对象,然后将其复制到发送的数据参数中发挥作用。不幸的是,行

data = items[rIndex].data;
我的检索功能中的

不适用于。或者 - >&gt;] 我90%肯定了。是访问它的正确方法,但我给出了错误&#34;没有合适的转换类型来自&#39;数据&#39;到'const数据*&#39;存在&#34;

如果不使用赋值重载运算符,或者我的重载执行错误,我怎么能实现这个呢?

1 个答案:

答案 0 :(得分:1)

bool BST::retrieve(const char *key, Data const *& data) const

第二个参数是对const数据的指针的引用,因此您必须将其设置为指针items[rIndex].data,而不是它的值。

考虑以下

void foo(int & out)
{
    out = 42;
}

当它被调用时

// ...
int x = 0;
foo(x);
std::cout << x;
将打印

42,因为对x 的引用已传递到函数中。您的情况稍有不同 - 您传递对指针的引用,以便调用者可以以与上述类似的方式检索指向数据的指针,例如:

int x; // global
// ...
void foo(int *& out)
{
    x = 42;
    out = &x; // set out to pointer to x
}

int main()
{
    int * ptr = nullptr;
    foo(ptr); // foo will set ptr to the pointer to x
    std::cout << *ptr; // prints 42
}

再次,将打印42。请注意使用一元引用&和deref,*运算符来获取指向x的指针,并取消引用ptr以提取其值。

顺便说一句,如果没有看到更多的课程,就无法判断Data::operator=的实施有多么糟糕。目前它已被破坏,因为在重叠的内存区域上使用strcpy是未定义的行为 - 如果有人试图将对象实例分配给自身(参见strcpy),就会发生这种情况。对于除自我分配以外的情况,只有在赋值的目标始终具有足够的空间用于源中的字符串时才是正确的。否则,您将写入未分配的内存。此外,如果有任何其他成员变量,他们也需要复制。