C++从地址识别数据结构

C++ identify data structure from adress

本文关键字:数据结构 识别 地址 C++      更新时间:2023-10-16

我想知道是否有办法C++知道地址在什么数据结构中。例如,我有一个基类 (A(,它有两个继承的类(B 和 C(。在第四个类(D(中,我有两个STL向量,一个包含B的指针,第二个包含C的指针。

在 D 中,我正在实现一个撤回对象 A 的方法。在该方法中,我正在使用 D 的另一个实现函数,该函数在向量中搜索对象 A 是否存在并返回指向该对象的指针。

之后有没有办法操纵对象 A 的适当向量以直接从向量中删除它(知道它在哪个向量中以及它在向量中的位置(?

A* D::findA(string word)
{
    for (unsigned int i = 0; i < vectorOfB_.size(); i++) {
        if ( vectorOfB_[i]->getWord() == word)
            return vectorOfB_[i];
    }
    for (unsigned int i = 0; i < vectorOfC_.size(); i++) {
        if (vectorOfC_[i]->getWord() == word)
            return vectorOfC_[i];
}
bool D::withdrawA(string word)
{
    A* obj = findA(word);
    if (obj != nullptr) {
    }
    return false;
}
此时,我知道

该方法找到了对象 A,我知道它的地址,但我不知道它在什么向量中。我想使用 STL 向量类的 erased(( 方法将其从向量中撤回,但不再次执行循环来检查向量。

我想你可以使用dynamic_cast来确定 A 的指针是 B 型还是 C 型。

bool D::withdrawA(string word)
{
    A* obj = findA(word);
    if (obj != nullptr) {
        if(dynamic_cast<B*>(obj) != nullptr) {
           // do something here for the B vector
        }
        else if(dynamic_cast<C*>(obj) != nullptr)
        {
           // do something here for the C vector
        }
    }
    return false;
}

由于您正在查询类(word(的成员以识别对象,我认为您不需要一些Maginc机器来实现您想要的东西。

您可以使用 STL 算法来实现这一点,例如具有以下类:

#include <memory>
#include <algorithm>
#include <vector>
#include <string>

using namespace std;

class A {
public:
    A(string word = "") :m_word(word){}
    virtual inline string getWord() { return m_word; }
protected:
    string m_word;
};
class B : public A { 
public: 
    B(string word = "") : A(word) {} 
};  
class C : public A { 
public:
    C(string word = "") : A(word) {} 
};

typedef shared_ptr<A> a_ptr;      
typedef vector<a_ptr> a_vector;

你可以编写一个函数:

a_ptr find_A(a_vector v, string word, bool erase = false){
    // Find the element.
    auto it = find_if(v.cbegin(), v.cend(),
        [word](const a_ptr &elem) {
            return elem->getWord() == word;
        }
    );
    // If you want to erase and it was found.
    // The code below can be implemented in a more elegant way, but
    // for that your classes will require you overload < operator and == operator.
    if (erase && it != v.end()) {
        v.erase(remove_if(v.begin(), v.end(), 
            [word](a_ptr elem){
                return elem->getWord() == word;
            }
        ), v.end());
    }
    return *it
}

现在,您将该函数与两个向量一起使用。


一个更具体的例子。

您也可以使用 STL 算法从向量中擦除:

假设您发现了一些A*

A* a_ptr =  findA(word);

然后你可以使用 STL 擦除,remove_if成语:

vectorOfB_.erase(remove_if(vectorOfB_.begin(), vectorOfB_.end(), 
    [a_ptr](A* elem){
        return elem->getWord() == a_ptr->getWord();
    }
), vectorOfB_.end());
vectorOfC_.erase(remove_if(vectorOfC_.begin(), vectorOfC_.end(), 
    [a_ptr](A* elem){
        return elem->getWord() == a_ptr->getWord();
    }
), vectorOfC_.end());

在C++中,没有办法通过地址直接知道数据结构。