gpt4 book ai didi

c++ - 返回对象时如何更改返回对象基类函数的实现 C++

转载 作者:行者123 更新时间:2023-11-28 03:55:40 25 4
gpt4 key购买 nike

我有一个现有的 C++ 应用程序,它带有一个自定义 ArrayBase 类,用于管理存储和对连续分配的内存区域的访问。我有一个单独的 ItrBase 类,用于访问该 ArrayBase 中的数据。 ArrayBase 有一个 createItr() 函数,当前返回一个 ItrBase 对象。

我需要扩展 ArrayBase 以使用多个内存分配而不是一个连续的内存分配。我创建了一个 EnhancedArray 类来执行此操作。为了使此 EnhancedArray 与现有应用程序兼容,它的 createItr() 函数必须返回适用于新的多内存分配的内容。

因此,我创建了一个派生的 EnhanceItr 类来执行此操作。我的问题是我无法找到解决数百个这样的代码的方法:

ItrBase anIterator = anArray.createItr();
...
double x = anIterator.getData();

anArray 是一个 EnhancedArray 时,使用 EhancedItrgetData() 函数。

这是一个简单的应用程序,说明了我的基本安排。

#include <iostream>
using namespace std;

class ItrBase {
public:
ItrBase() { cout << "ItrBase constructor.\n"; };
~ItrBase() { cout << "ItrBase destructor.\n"; };
virtual int vfunc() {return 1;};
};


class EnhancedItr : public ItrBase {
public:
EnhancedItr() { cout << "EnhancedItr constructor.\n"; };
~EnhancedItr() { cout << "EnhancedItr destructor.\n"; };
int vfunc() {return 0;};
};


class ArrayBase {
public:
ArrayBase() { cout << "ArrayBase constructor.\n"; };
~ArrayBase() { cout << "ArrayBase destructor.\n"; };
virtual ItrBase & createItr() {cout << "in AB's createItr()\n"; return *new ItrBase(); };
};


class EnhancedArray : public ArrayBase {
public:
EnhancedArray() { cout << "EnhancedArray constructor.\n"; };
~EnhancedArray() { cout << "EnhancedArray destructor.\n"; };
EnhancedItr & createItr() {cout << "in EA's createItr()\n"; return *new EnhancedItr(); };
};


int main()
{
ArrayBase ab;
EnhancedArray ea;

ItrBase itr = ab.createItr();
ItrBase eitr = ea.createItr(); //EnhancedItr assigned to ItrBase

cout << "ArrayBase's Itr .vfunc(): " << itr.vfunc() <<std::endl;
cout << "EnhancedArray's Itr .vfunc(): " << eitr.vfunc() <<std::endl;
return 0;
}

当我希望第二次调用返回 0 时,上面对 vfunc() 的两次调用都返回 1。

main() 中,我知道如果我将 ItrBase 类型更改为 ItrBase &,我确实会得到所需的返回类型,但后来我在数百个区域修改我的“现有”代码,并且没有调用迭代器的析构函数。

还有其他我没有看到的策略吗?

谢谢。

最佳答案

当然,如果您被允许重写 ItrBase,那么您可以使用委托(delegate)将所有函数调用传递给一个实现类,您通过指针或引用持有该实现类,以便多态性生效.这看起来很像 pimpl。而且调用者根本不需要编写,只需重新编译即可。

编辑:为不熟悉 pimpl 的人编写的代码。

struct ItrBase
{
struct ItrImpl
{
virtual ~ItrImpl(){}
virtual int vfunc() = 0;
};

ItrBase(ItrImpl peer) : m_peer(peer) { cout << "ItrBase constructor.\n"; }
~ItrBase() { cout << "ItrBase destructor.\n"; }
int vfunc() { return m_peer->vfunc(); }
private:
const unique_ptr<ItrImpl> m_peer;
};

class ArrayBase
{
struct ItrImpl : public ItrBase::ItrImpl
{
virtual int vfunc() { return 0; }
};

public:
ArrayBase() { cout << "ArrayBase constructor.\n"; };
~ArrayBase() { cout << "ArrayBase destructor.\n"; };
virtual ItrBase createItr() { cout << "in AB's createItr()\n"; return ItrBase(new ItrImpl); };
};

class EnhancedArray : public ArrayBase
{
struct ItrImpl : public ItrBase::ItrImpl
{
virtual int vfunc() { return 1; }
};

public:
EnhancedArray() { cout << "EnhancedArray constructor.\n"; };
~EnhancedArray() { cout << "EnhancedArray destructor.\n"; };
virtual ItrBase createItr() { cout << "in EA's createItr()\n"; return ItrBase(new ItrImpl); };
};

关于c++ - 返回对象时如何更改返回对象基类函数的实现 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3746392/

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