gpt4 book ai didi

c++ - MFC-CArray 复制

转载 作者:行者123 更新时间:2023-12-03 07:51:29 24 4
gpt4 key购买 nike

我有两个填充整数的数组。

不能使用等号运算符,因为编译器会给出一个错误。

源代码如下。请帮忙。

CArray <int, int&> temp;
CArray <int, int&> definition;

definition = temp;

错误如下:

error C2280: CArray<int,int &> &CArray<int,int &>::operator =(const CArray<int,int &> &): attempting to reference a deleted function

最佳答案

CArray类模板源自CObject 。后者将其复制构造函数和赋值运算符声明为私有(private),并且 CArray 必然继承这些属性。任何尝试使用任一结果都会导致编译器错误 C2280 .

然而,

CArray 提供了公共(public) Copy()将数据从 CArray 实例复制到调用它的 CArray 实例的成员。

更换

definition = temp;

definition.Copy(temp);

修复了编译器错误并将值从 temp 复制到 definition 中。在这行代码之后,definitiontemp 保存相同的数据。


改善人体工程学

对歧义进行取模(Copy() 是从左侧复制还是复制到左侧?),明确地没有任何问题调用类成员。不过,理想情况下,应该可以使用自定义功能来增强外部类型的接口(interface),以允许编写简洁的代码。

自由函数长期以来一直是 C++ 中的首选解决方案,运算符也不异常(exception)。尽管如此,由于我不知道的原因,C++ 不允许提供 assignment operator (operator=) 作为自由函数。

它确实允许从外部提供所有“复合”赋值运算符作为自由函数(例如operator+=)。这样,我们就可以通过引入以下内容来接近我们想要编写的内容:

template<typename T, typename U>
inline CArray<T, U>& operator+=(CArray<T, U>& dst, CArray<T, U> const& src)
{
dst.Append(src);
return dst;
}

有了这个函数模板,我们就可以编写

definition += temp;

并且至少通过映射到类 C 语言中流行的传统 lhs/rhs 二分法来消除歧义。这实现了“追加”功能(而不是“复制”)。为了使“追加”和“复制”行为相同,左侧需要为空。调用RemoveAll()如果需要的话,事先建立这个前提条件。

这并不理想,但至少是这样。这是我们在不引入新类型(例如,通过从 CArray 类模板派生)的情况下(在撰写本文时)能做到的最好的事情。

关于c++ - MFC-CArray 复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76990713/

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