gpt4 book ai didi

c++ - 为对基础对象进行操作的函数提供派生对象数组

转载 作者:搜寻专家 更新时间:2023-10-31 01:18:34 25 4
gpt4 key购买 nike

为这个问题找到合适的标题对我来说有点困难,但这是我的情况。假设我有一个基类和一个派生类,我可以传递一个函数,该函数采用 *base 类型的参数而不是 *derived

class base{protected:    float M_OutputValue;    float M_InputValue;public:    virtual void CalculateOutput() = 0;        /* more functions */};class derived: public base{public:    void CalculateOutput(){ /*stuff*/};    /* more functions */};

这是一个将基类作为输入的函数。

void CalculateAllOutputs(base* basearray, int NumberofElements){    int temp = 0;    while(temp < NumberOfElements)    {         basearray[temp]->CalculateOutput();         temp++;    }};

我想知道是否可以向该函数传递一个指向派生对象数组的指针。根据我对从 derived 到 base 的指针转换的理解,它是隐含的,没有太多可担心的(我查看了 this 问题以获取答案)。我担心的是,因为派生类有更多的成员,它占用更多的字节。这将导致数组中的成员相距更远,因此在遍历它时,需要将更大的偏移量添加到内存地址才能到达下一个元素。我想知道编译器是否会处理这些问题,以便我将数组传递给的函数知道如何访问派生数组的成员。我也可以使用模板解决我的问题,这里没有解决方案,但我正努力在多态性方面做得更好。

谢谢。

最佳答案

你是对的。远离数组,最好使用

std::vector<std::unique_ptr<base>>

或者如果你没有 C++0x-ready 编译器(如果是这种情况,那么考虑升级),你可以使用

boost::ptr_vector<base>

两者都是指针 vector ,可以自动清理指向的对象。避免使用原始指针,正如您所指出的,普通数组简直糟透了。

使用示例:

void calculate_outputs(const std::vector<std::unique_ptr<base>>& b)
{
std::for_each(b.begin(), b.end(), [](const std::unique_ptr<base>& x)
{
x->CalculateOutput();
});
}

关于c++ - 为对基础对象进行操作的函数提供派生对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7018183/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com