gpt4 book ai didi

c++ - 多态、运算符重载

转载 作者:行者123 更新时间:2023-11-28 01:23:32 25 4
gpt4 key购买 nike

假设我有一个 PArr 类,它存储各种类 StringWrapper、FloatWrapper、IntWrapper 的数组——所有这些都派生自基类 Wrapper。

这是 PArr 类:

class PArr{
private:
Wrapper** _wrappers;
int _size;
public:
PArr(int size);
Wrapper& operator[](int index);


};

下面是这个类的实现

#include "PArr.h"

PArr::PArr(int size){

_size = size;
_wrappers = new Wrapper*[_size];

}

Wrapper& PArr::operator[](int index){

return _wrappers[index];
}

这里是类,例如 FloatWrapper

#pragma once
#include "Wrapper.h"

class FloatWrapper : public Wrapper{
private:
float* _floatPtr;
public:
FloatWrapper(float number);

};

我的主要方法是这样的:

int main() {  
PArr a(3);

a[0] = new FloatWrapper(0.1);
}

我得到一个错误:“与‘operator=’不匹配(操作数类型为‘Wrapper’和‘FloatWrapper*’)

我做错了什么?

最佳答案

冒着陈述显而易见的风险:您的operator[] 正在返回一个Wrapper&,这是一个reference 类型,而您'我们正在尝试为其分配一个Wrapper*,一个指针类型。这是行不通的。

如果你稍微重写了你的主要功能,像这样说:

int main()
{
PArr a(3);
auto k = a[0];
}

您可能会发现错误信息更丰富:

main.cpp: In member function 'Wrapper& PArr::operator[](int)':

main.cpp:27:27: error: invalid initialization of reference of type 'Wrapper&' from expression of type 'Wrapper*'

return _wrappers[index];

~~~~~~~~~~~~~~~^

你可以尝试这样的事情:

Wrapper*& PArr::operator[](int index)
{
return _wrappers[index];
}

它确实编译并让您的原始 main 运行,至少对我而言。我不再做任何 promise 。

最后,这个答案不是深入探讨代码问题的地方(使用智能指针,使用标准库容器类,如 arrayvector,考虑诸如 std::anystd::variant)之类的东西,但是,你知道,你应该阅读这些东西。

关于c++ - 多态、运算符重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55010744/

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