当前位置: 首页 > 知识库问答 >
问题:

如何使用基类作为C++中派生类的占位符?

濮献
2023-03-14

我正在循环一些代码来填充一些对象。我花了很长时间试图简化这个循环,但我仍然坚持使用基类作为派生类的占位符。我觉得这应该是可能的,但我不能使它起作用。

我正在运行一个映射,寻找值中的特定字符串。如果我找到一个这样的字符串,我将它拆下并将它包含的数据存储在一个对象中。根据字符串的不同,我需要存储在不同子类(可能是5-7个子类)中的信息。我觉得我可以在不损失可读性的情况下进一步缩短它,方法是使用父对象作为临时对象,并在for-loop中只定义它一次,但我不知道是如何实现的。如果我执行all_object_as.push_back(parent_object),则.push_back()函数将不起作用。

store_data()函数只在父类中定义。

std::vector<Derived_object_A> all_object_As;
std::vector<Derived_object_B> all_object_Bs;    

for (auto element : some_map)
{
    std::vector<string> data_buffer = separate_data(get_data(element.second));

    if (element.second.find("SOMETEXT") != string::npos)
    {
        Derived_object_A object;
        object.store_data(data_buffer);

        all_object_As.push_back(object);
    }

    if (element.second.find("SOMEOTHERTEXT") != string::npos)
    {
        Derived_object_b object;
        object.store_data(data_buffer);

        all_object_Bs.push_back(object);
    }
}

共有1个答案

曹泉
2023-03-14

自然的做法是取代:

std::vector<Derived_object_A> all_object_As;
std::vector<Derived_object_B> all_object_Bs; 

std::vector<Base_object&> all_objects;

但是不能有引用的vector。因此,这就给您留下了各种方法:

std::vector<Base_object*> all_objects_ptr; // but then you need to manage ownership and lifetimes
std::vector<std::shared_ptr<Base_object>> all_objects_shared_ptr;

对于reference_wrapper也可能有一种方法。

最适合您的可能是基于意见的,并且无论如何都需要看到更多的代码。

 类似资料:
  • 我有一个应用程序,它由一个服务器组成,该服务器可以有多个两种类型的客户端,即用户客户端和设备客户端。为此,我有一个客户端基类的向量,我将在其中添加新客户端,因为它们连接到服务器。这是我所拥有的简化版本: 我有下面的UML表示: 我怀疑这张图是否代表了正确的意图。也许我对UML不是很有经验,这就足够了,但是我认为这个图没有清楚地描述服务器中的向量将包含用户和设备而不是客户端的事实。我不知道我是否需要

  • 从已有的对象类型出发建立一种新的对象类型,使它部分或全部继承原对象的特点和功能,这是面向对象设计方法中的基本特性之一。继承不仅简化了程序设计方法,显著提高了软件的重用性,而且还使得软件更加容易维护。派生则是继承的直接产物,它通过继承已有的一个或多个类来产生一个新的类,通过派生可以创建一种类族。   继承 基本概念 在定义一个类A时,若它使用了一个已定义类B的部分或全部成员,则称类A继承了类B,并称

  • 假设我有一个没有数据的类: 和派生类 Empty类的对象的大小为1。派生类的空部分的大小通常为0。据我所知,编译器看到基Empty类没有数据,因此它可以优化Empty的大小,以防它“在”Derived中,但标准并不要求这样做。 所以问题是: 我能在编译时确定Derived类的Empty部分并没有占用内存吗。 我知道我可以像一样进行检查...但它太冗长了,并且有几个类,如派生。有没有更优雅的解决方案

  • 和构造函数类似,析构函数也不能被继承。与构造函数不同的是,在派生类的析构函数中不用显式地调用基类的析构函数,因为每个类只有一个析构函数,编译器知道如何选择,无需程序员干涉。 另外析构函数的执行顺序和构造函数的执行顺序也刚好相反: 创建派生类对象时,构造函数的执行顺序和继承顺序相同,即先执行基类构造函数,再执行派生类构造函数。 而销毁派生类对象时,析构函数的执行顺序和继承顺序相反,即先执行派生类析构

  • 主要内容:构造函数的调用顺序,基类构造函数调用规则前面我们说基类的成员函数可以被继承,可以通过派生类的对象访问,但这仅仅指的是普通的成员函数, 类的构造函数不能被继承。构造函数不能被继承是有道理的,因为即使继承了,它的名字和派生类的名字也不一样,不能成为派生类的构造函数,当然更不能成为普通的成员函数。 在设计派生类时,对继承过来的成员变量的初始化工作也要由派生类的构造函数完成,但是大部分基类都有 private 属性的成员变量,它们在派生类中无法

  • 问题内容: 因此,此代码的输出为。现在,我想到了一个问题:作为 派生 类对象的 po 怎么能调用作为基类的 PrivateOverride 的私有方法? 问题答案: 因为您在类中定义了main方法。如果将main方法放在Derived类中,它将无法编译,因为在该类中不可见。 class中的po.f()调用不是多态的,因为in 类为,所以in class中的值不会被覆盖。