gpt4 book ai didi

c++ - 赋值运算符重载/检索函数

转载 作者:太空宇宙 更新时间:2023-11-04 11:23:48 25 4
gpt4 key购买 nike

我正在尝试从 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;

在我的检索函数中不适用于 .或 ->]我 90% 确定 .是访问它的正确方法,但我收到错误“不存在从‘Data’到‘const Data *’的合适转换类型”

如果不使用赋值重载运算符,或者我的重载实现有误,我还能如何实现这一点?

最佳答案

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

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

考虑以下问题

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提取其值(value)。

顺便说一句,无法判断您对 Data::operator= 的实现有多糟糕。没有看到更多的类(class)。就目前而言,它已损坏,因为使用 strcpy 是未定义的行为在重叠的内存区域上——如果有人试图将一个对象实例分配给自己,就会发生这种情况(参见 strcpy )。对于自赋值以外的情况,仅当赋值的目标始终有足够的空间用于源中的字符串时才是正确的。否则,您将写入未分配的内存。另外,如果有任何额外的成员变量,它们也需要复制。

关于c++ - 赋值运算符重载/检索函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27369710/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com