如何在 C++ 中从继承的类模板中提取数据

How to extract data from an inherited class template in C++

提问人:rasa911216 提问时间:4/9/2023 更新时间:4/9/2023 访问量:43

问:

我正在编写一个类对象向量,每个类对象都包含一个 C++ 中的 Template 变量,以便它允许我处理不同类型的数据。

我正在使用以下代码:

#include <iostream>
#include <memory>
//Declare Vector library to work with vector objects.
#include <vector>
#include <string>
    
using namespace std;

class AItem{
};
    
template <class OBJ>
    
//Object that will hold template data.
class Item : public AItem {
    public:
        //Variable to store the values. TODO: Verify if this can be made into a TEMPLATE to accept any value.
        OBJ value;
    
        //Constructor to store values.
        Item(OBJ _value): value(_value){}

        ~Item(){ 
            cout << "Deleting " << value << "\n";
        }
};

//Main Thread.
int main(){
    //##################################################
    //##################################################
    //                TEST SECTION

    //Create new Items.
    Item<string> *itObj = new Item<string>("TEST");
   //Create a Vector that stores objects.
    vector <shared_ptr<AItem>> v1;

    //Store each item in the Array.
    v1.push_back(shared_ptr<AItem>(itObj));

    //cout<<&v1.getValue()<<"\n";

    //Iterate through each one and retrieve the value to be printed.
    //TODO: FIX THIS
    for(auto & item: v1){
        cout<<item<<'\n';
    }
    //##################################################
    //##################################################
    cout<<"Cpp Self Organizing Search Algorithm complete.\n";
    return 0;
}

并且我想检索插入的值,但是每当我迭代是否使用指针或访问数据时,我只会得到一个内存地址,或者我被告知类 AItem 没有属性。在 C++ 中访问嵌套类中的变量的正确方法是什么?

C++ 变量 向量 嵌套

评论

0赞 Sam Varshavchik 4/9/2023
你知道什么是虚拟方法,它们是如何工作的,以及如何使用它们吗?
0赞 rasa911216 4/9/2023
没有那么多,我知道指针,但这些shared_pointers是新事物。我试图研究它们,但我仍然不明白在这种嵌套情况下它们如何与模板耦合。
0赞 Sam Varshavchik 4/9/2023
听起来你需要的是一本好的C++教科书。C++太复杂了,无法通过关键字搜索,阅读博客,进行随机编码拼图或观看Youtube视频来学习。所有“24小时学习C++”的Youtube视频都是点击诱饵。只有一本好的、经过编辑的 C++ 教科书才会有一个有组织的课程,所有科目都按章节排列,每章按逻辑顺序介绍逐步高级主题。虚拟继承和函数通常先解释,然后再进行智能指针,所以一旦你到达这一点,这就不是那么神秘了。

答:

1赞 clove682 4/9/2023 #1

也许是因为你没有在父类中定义一些虚函数,就像这样?

struct AItem {
  virtual void a() { printf("AItem::a()\n"); }
  virtual void b() { printf("AItem::b()\n"); }
};
template <class OBJ> struct Item : public AItem {
public:
  OBJ value;
  Item(OBJ _value) : value(_value) {}
  void a() override { printf("Item::a()\n"); }
  void b() override { printf("Item::b()\n"); }
  ~Item() { std::cout << "Deleting " << value << "\n"; }
};
/* Use it like below
for (auto &item : v1) {
  item->a();
  item->b();
}
*/

评论

0赞 rasa911216 4/10/2023
多谢!刚刚对其进行了测试并进行了轻微的修改以访问这些值。因此,我似乎需要更多地研究虚拟继承、结构和函数。再次感谢!