删除时,C ++的良好面向对象设计

时间:2009-11-20 05:45:20

标签: c++

下面的代码删除了与股票对象关联的符号。它只是糟糕的面向对象设计。

我搜索每个股票代码的方式是使用!=或==测试为NULL。

bool hashmap::remove(char const * const symbol, stock &s,
int& symbolHash, int& hashIndex, int& usedIndex)
{
    if ( isAdded == 0 ) return false;
    if ( hashTable[isRemoved].symbol == symbol ) return true; 
    else 
    {
        symbolHash = this->hashStr( symbol ); 
        hashIndex = symbolHash % maxSize;
        usedIndex = hashIndex;
    }
    for ( int integer = 0; integer < maxSize; integer++ )
    {
        if ( hashTable[usedIndex].symbol != NULL &&
             strcmp( hashTable[usedIndex].symbol, symbol ) == 0 )
        {   
            isAdded--; 
            isRemoved = hashIndex; 
            s = &hashTable[usedIndex];
            delete hashTable[usedIndex].symbol; 
            hashTable[usedIndex].symbol = NULL; 
            return true;
            }
        ++usedIndex %= maxSize; // wrap around if needed
    }
    return false;
}

我现在想知道,如果我以这样的方式删除:

hashTable[usedIndex].symbol = hashTable[NULL].symbol

因此,改变我逻辑测试空或找到的股票代码的方式。他们是否可以在不重做查找和搜索方面的情况下删除我的股票代码?

这是在面向对象设计中删除的正确方法吗?

2 个答案:

答案 0 :(得分:4)

首先,“面向对象设计”非常模糊。

isAdded是成员变量吗?目前尚不清楚它是否并且在查看签名时对此函数创建了另一个依赖性。同样适用于isRemoved

通常,一个带有5个参数的函数接近显示对该函数的依赖性太大(永远不要在isAddedisRemovedhashTable中隐藏不可见的依赖项

我不确定hashTable是什么类型,但您永远不必在2009年致电delete。您可以使用auto_ptrshared_ptr,{{1 (在C ++ 0x中)。这些将在不再需要时释放您的资源。如果您使用的是STL容器,请不要使用unique_ptr

如果你想在C ++中使用哈希表,你真的应该考虑使用hash_map。这将是一个比我们99.9999%的人能完成的更好的实施。

使用hash_map时,可以调用auto_ptr来删除/删除元素。

答案 1 :(得分:2)

如何处理插入碰撞?大多数标准解决方案 - 例如线性搜索开放槽,或生成新哈希 - 使删除元素成为问题。如果删除很常见,请考虑使用列表结构。