相关疑难解决方法(0)

C++ - 如何重载operator + =?

给出以下代码片段,

class Num
{
public:
    Num(int iNumber = 0) : m_iNumber(iNumber) {}

    Num operator+=(const Num& rhs)
    {
        this->m_iNumber = (this->m_iNumber + rhs.m_iNumber);
        return *this;
    }
private:
    int m_iNumber;
};

//===========================================================
int _tmain(int argc, _TCHAR* argv[])
{
    Num a(10);

    Num b(100);

    b += a;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我想知道如何正确超载operator+=.

问题:

  1. 如何定义此运算符的签名?特别是,什么应该用于返回值?

  2. 如何实现功能体?

  3. 如何使用这个重载运算符?

我已经提供了上述解决方案,但我担心这是不正确的.

c++

22
推荐指数
3
解决办法
7万
查看次数

C++20 比较:关于不明确的反向运算符的警告

考虑这个有效的 C++17 示例:

struct A {
   bool operator==(const A&);
};


int main() {
   return A{} == A{};
}
Run Code Online (Sandbox Code Playgroud)

使用 -std=c++20 在 clang 中编译时,它给出

struct A {
   bool operator==(const A&);
};


int main() {
   return A{} == A{};
}
Run Code Online (Sandbox Code Playgroud)

这个警告是否意味着 C++20 不允许使用典型的比较运算符来比较两个相同类型的对象?什么是正确的选择?这种情况在未来的选秀中会发生变化吗?

c++ c++20

22
推荐指数
2
解决办法
2723
查看次数

如何最好地重载operator <> <=> =但只写一个或两个比较函数?

我有一个类型为std :: string的类.我想通过比较属性为类提供一些比较运算符函数,如<,>,==,<=和> =.

我的问题是:任何简单的方法或工具

(1)只写一个或两个函数,例如一个用于运算符<(和==),其他函数可以自动生成.

(2)甚至更简单,因为类比较取决于std::string其比较函数已经提供的类型属性.

c++ comparison operator-overloading

21
推荐指数
3
解决办法
4987
查看次数

对于operator ==来改变其操作数是不好的做法?

脚本

我有一个课我希望能够比较平等.这个类很大(它包含一个位图图像),我会多次比较它,所以为了提高效率,我要对数据进行哈希处理,只检查哈希是否匹配.此外,我将只比较我的对象的一小部分,所以我只是在第一次完成相等性检查时计算哈希值,然后使用存储的值进行后续调用.

class Foo
{
public:

   Foo(int data) : fooData(data), notHashed(true) {}

private:

   void calculateHash()
   {
      hash = 0; // Replace with hashing algorithm
      notHashed = false;
   }

   int getHash()
   {
      if (notHashed) calculateHash();
      return hash;
   }

   inline friend bool operator==(Foo& lhs, Foo& rhs)
   {
      if (lhs.getHash() == rhs.getHash())
      {
         return (lhs.fooData == rhs.fooData);
      }
      else return false;
   }

   int fooData;
   int hash;
   bool notHashed;
};
Run Code Online (Sandbox Code Playgroud)

背景

根据这个答案的指导,平等运算符的规范形式是:

inline bool operator==(const X& lhs, const X& rhs);

此外,操作符重载以下一般建议 …

c++ comparison equality const operator-overloading

21
推荐指数
2
解决办法
1382
查看次数

建议C++容器保存前20个最小值

在SQL中有一个类似的功能

SELECT TOP 20 distance FROM dbFile ORDER BY distance ASC
Run Code Online (Sandbox Code Playgroud)

如果我的SQL是正确的,比如10,000条记录,这应该返回我的数据库中的20个最小距离.

我没有数据库.我有一个100,000元素的简单数组.

是否有C++容器,Boost,MFCSTL为结构提供简单的代码

struct closest{
    int    ID;
    double distance;
    closest():ID(-1), distance(std::numeric_limits<double>::max( )){}
};
Run Code Online (Sandbox Code Playgroud)

我可以在哪里建立一个按距离排序的容器

boost::container::XXXX<closest> top(20);
Run Code Online (Sandbox Code Playgroud)

然后有一个简单的

top.replace_if(closest(ID,Distance));
Run Code Online (Sandbox Code Playgroud)

如果容器将使用我的新条目替换当前最高距离的条目,如果它小于我容器中的当前最高距离.

我并不担心速度.我喜欢优雅干净的解决方案,其中容器和代码做所有的繁重.

编辑.收到所有重要答案后的附录.

由于它的优雅,我真的很想找到它.是一个可以使用容器大小限制创建的已排序容器.在我的情况下20.然后我可以推送或插入我心中的内容10万件或更多.但.总有一个但是.如果容器的比较器值不在最低的20个值内,则通过替换或不插入项目,容器将保持最大20的大小.

是.我现在从所有这些答案中知道,通过编程和调整现有容器,可以实现相同的效果.也许当C&C++标准委员会的下一轮建议出现时.我们可以建议.自我分类(我们已经有了)和自我限制容器.

c++ containers filtering

20
推荐指数
5
解决办法
1922
查看次数

为什么不能使三元运算符超载?

为什么不能使三元运算符超载?:'?

我经常使用三元运算符来合并if语句,并且很好奇为什么语言设计者选择禁止此运算符过载.我找到了解释为什么在C++运算符重载但未找到描述为什么这是不可能的解释.脚注提供的唯一信息是它不能超载.

我最初的猜测是,重载运算符几乎总是违反上面链接中给出的第一或第二原则.重载的含义很少是明显的或明显的,或者它将偏离其原始的已知语义.

所以我的问题更多的是为什么这不可能而不是如何,因为我知道它无法完成.

c++ operator-overloading operators ternary-operator visual-c++

19
推荐指数
3
解决办法
8958
查看次数

为什么我不能增加枚举类型的变量?

我有一个枚举类型StackID,我使用枚举来引用特定向量的索引,它使我的代码更容易阅读.

但是,我现在需要创建一个名为nextAvailtype 的变量StackID.(它实际上指的是特定的stackID).我尝试增加它,但在C++中,以下是非法的:

nextAvail++;
Run Code Online (Sandbox Code Playgroud)

哪种对我有意义...因为没有界限检查.

我可能忽略了一些明显的东西,但什么是一个很好的替代品呢?


我也想链接到这个问题.

c++

18
推荐指数
3
解决办法
3万
查看次数

为什么可以将友元函数定义放在类定义中?

是否应该在类之外明确定义朋友函数?
如果是这样,为什么我可以像任何成员函数一样在类定义中声明友元函数?
这是什么 ?
是否仅<适用于某些运营商(如运营商)或是否适用于所有运营商?
如果它适用于所有这些,那么这样做是否有任何不利之处?
应该避免吗?如果是这样的话?

class person 
{
public:
    bool operator<(int num)
    {
        return  x < num ? true : false ;
    }
    bool operator<(person& p)
    {
        return  x < p.x ? true : false ;
    }

    friend bool operator<(int num, person &p)
    {
        return  p.x < num ? true : false ;
    }

    void setX(int num)
    {
        x = num;
    }

private:
    int x;


};
Run Code Online (Sandbox Code Playgroud)

更新:
我不是要求选择非成员运算符重载或成员运算符重载.
我想知道的是:
为什么我们被允许在我们的类定义中移动friend方法的定义?.
它不违反任何事情吗?如果不是,为什么我们会在第一时间有朋友? …

c++ operator-overloading friend

17
推荐指数
3
解决办法
7567
查看次数

我可以做x = y = z。在C ++中为什么不允许x &lt;y &lt;z?

我是编程新手,并且有关于在一行上使用多个运算符的问题。

说,我有

int x = 0;
int y = 1;
int z = 2;
Run Code Online (Sandbox Code Playgroud)

在此示例中,我可以使用分配操作符链: x = y = z;

然而,我怎么就不能使用:x < y < z;

c++

17
推荐指数
4
解决办法
1666
查看次数

转换逻辑的目标是什么类型?

我不明白为什么在下面的代码中表达式C c3 = 5 + c; 不会被编译,尽管5可以转换为类型C,就像在前面的语句中一样.

#include <iostream>

class C 
{
    int m_value;
public:
    C(int value): m_value(value) {} ;

    int get_value() { return m_value; } ; 

    C operator+(C rhs) { return C(rhs.m_value+m_value); }
};

int main()
{
    C c = 10;
    C c2 = c + 5; // Works fine. 5 is converted to type C and the operator + is called
    C c3 = 5 + c; // Not working: compiler error. Question: Why is 5 not …
Run Code Online (Sandbox Code Playgroud)

c++ operator-overloading

16
推荐指数
3
解决办法
924
查看次数