Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 良好的面向对象的删除设计,C++;_C++ - Fatal编程技术网

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

C++ 良好的面向对象的删除设计,C++;,c++,C++,下面的代码很好地删除了与股票对象关联的符号。这就是糟糕的面向对象设计 我搜索每个股票符号的方式是使用!=or==测试空值 bool hashmap::remove(char const * const symbol, stock &s, int& symbolHash, int& hashIndex, int& usedIndex) { if ( isAdded == 0 ) return false; if ( hashTable[isRemov

下面的代码很好地删除了与股票对象关联的符号。这就是糟糕的面向对象设计

我搜索每个股票符号的方式是使用!=or==测试空值

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;
}
因此,我改变了逻辑测试空股票符号或找到股票符号的方式。它们是一种删除我的股票符号而不必重新进行查找和搜索的方法吗


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

如何处理插入冲突?大多数标准的解决方案,如线性搜索打开的插槽,或生成新的哈希,都会使删除元素成为问题。如果删除是常见的,请考虑使用列表结构。

如何处理插入冲突?大多数标准的解决方案,如线性搜索打开的插槽,或生成新的哈希,都会使删除元素成为问题。如果删除是常见的,则考虑使用列表结构来代替。

首先,“面向对象的设计”非常含糊。p>

isAdded
是否为成员变量?现在还不清楚它是否是,并且创建了另一个依赖于此函数的依赖项,当查看签名时,这种依赖项并不明显。同样的事情也适用于
isRemoved

通常,一个具有5个参数的函数接近于显示对该函数有太多依赖关系(无论
中的不可见依赖关系是添加的
是删除的
,还是
哈希表

我不确定hashTable的类型是什么,但是在2009年你不应该调用delete。您可以使用
auto\u ptr
shared\u ptr
unique\u ptr
(在C++0x中)。当不再需要你的资源时,这些将释放你的资源。如果您使用的是STL容器,那么不要使用
auto_ptr

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

使用散列映射时,可以调用
void erase(迭代器优先,迭代器最后)
来擦除/删除元素。

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

isAdded
是否为成员变量?现在还不清楚它是否是,并且创建了另一个依赖于此函数的依赖项,当查看签名时,这种依赖项并不明显。同样的事情也适用于
isRemoved

通常,一个具有5个参数的函数接近于显示对该函数有太多依赖关系(无论
中的不可见依赖关系是添加的
是删除的
,还是
哈希表

我不确定hashTable的类型是什么,但是在2009年你不应该调用delete。您可以使用
auto\u ptr
shared\u ptr
unique\u ptr
(在C++0x中)。当不再需要你的资源时,这些将释放你的资源。如果您使用的是STL容器,那么不要使用
auto_ptr

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


使用散列映射时,可以调用
void erase(迭代器优先,迭代器最后)
来擦除/删除元素。

right。这实际上是一项任务。我的指导老师告诉我不能用delete dt.right删除。这实际上是一项任务。我的导师告诉我我不能用delete dt删除。
hashTable[usedIndex].symbol = hashTable[NULL].symbol