gpt4 book ai didi

c++ - operator+ 和 operator= 如何一起使用?

转载 作者:太空宇宙 更新时间:2023-11-04 16:21:32 28 4
gpt4 key购买 nike

我类有 2 个运算符有点问题。

我的类(class)宣布:

template <class keyType, class valueType>
class MyMap{

keyType keys[MAX];
valueType values[MAX];
int size;
}

我需要重新定义运算符 [],例如当我调用:std::cout<<MyMap1["a"]; 时.

keyType& operator[] (keyType key){}

它工作正常。我也用它来做作业,它很好,例如:MyMap1["a"]="a1";

代码很完美。但在我的operator[]我增加 size参数,它只有在我想进行赋值时才有用。当我只做 std::cout 时,我不想增加它.

所以也许我应该重新定义 operator=功能,但当我不能写时:

void operator=(valueType value){}

因为MyMap1["a"] = "a1"的左成员是 keyType而不是 MyMap类型。

我该怎么做?

最佳答案

问题本身不是输出;这就是你在 key 不存在。我认为你指定是非常重要的在走得更远之前。有很多可能性:

  • 你可以做 std::map 做的事,并使用默认值插入它值(value)。这在很多情况下非常方便,但这确实意味着你不能在 const 映射上使用 []

  • 您可以让运算符返回一个指针,其中包含一个空值对象不存在时的指针。就个人而言,我不喜欢这用于 operator[];这意味着你必须写东西像:ValueType* p = myMap[key];如果 ( p != NULL ) ...,这[] 似乎不自然。 (另一方面,它确实有效以及 findget 函数。)

  • 你可以抛出异常(或者甚至使用断言,如果你提供一个contains函数,并将其作为[]).

  • 您可以返回预定义的默认值。这是一种与第一个解决方案相反;这意味着 operator[]永远不会改变 map ,也不需要一个非常量版本。

  • 最后(这似乎是您的目标):您可以让 operator[] 返回一个代理,以区分在用作右值的 myMap["a"]myMap["a"] 之间
    = 东西
    。我的感觉是这个解决方案不结婚与 C++ 的工作方式很好,但它用于其他语言(例如像 Python)。

对于最后一个解决方案,您将使用类似的东西:

class MyMap
{
class Proxy
{
MyMap* myOwner;
KeyType myKey;
public:
Proxy( MyMap* owner, KeyType key )
: myOwner( owner )
, myKey( key )
{
}

Proxy const& operator=( ValueType value ) const
{
myOwner->insertOrUpdate( myKey, value );
return *this;
}

operator ValueType() const
{
if ( !myOwner->contains( myKey ) ) {
throw UnknownKeyException( myKey );
}
return myOwner->get( myKey );
}
};

public:
Proxy operator[]( KeyType key )
{
return Proxy( this, key );
}
};

关于c++ - operator+ 和 operator= 如何一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16142399/

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