簡體   English   中英

賦值運算符重載/檢索功能

[英]Assignment operator overload / retrieve function

我正在嘗試從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;
}

有一個稱為項目的結構數組,看起來像這樣

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參數中。 不幸的是,這條線

data = items[rIndex].data;

在我的檢索功能中不適用於。 或->]我有90%的把握。 是訪問它的正確方法,但出現錯誤“不存在從'數據'到'常量數據*'的合適轉換類型”

在不使用賦值重載運算符的情況下,或者在我的重載實現錯誤的情況下,我還能如何實現呢?

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

第二個參數是對指向const Data的指針引用 ,因此您必須將其設置為指向 items[rIndex].data指針 ,而不是其值。

考慮以下

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

當這樣的話

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

因為將x引用傳遞到函數中,所以將打印42。 您的情況略有不同-向您傳遞了一個指向指針引用 ,以便調用者可以按照與上述類似的方式檢索指向數據的指針,例如:

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。 注意,使用一元ref &和deref *來獲取指向x的指針,並取消引用ptr以提取其值。

順便說一句,在看不到更多類的情況下,無法斷定Data::operator=實現是多么糟糕。 就目前而言,它是殘破的,因為在內存的重疊區域上使用strcpy是一種不確定的行為-如果有人嘗試為其分配對象實例,則會發生這種情況(請參閱strcpy )。 對於自分配以外的情況,只有分配的目的地始終為源中的字符串留有足夠的空間才是正確的。 否則,您將寫入未分配的內存。 另外,如果還有其他成員變量,它們也將需要復制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM