【问题标题】:Operator overloading c++ placement运算符重载 c++ 放置
【发布时间】:2011-09-01 10:27:48
【问题描述】:

我无法弄清楚我创建的重载运算符的放置位置。他们应该在他们操作的班级还是里面?两种方式都给我带来了麻烦。任何指针都会很棒。

这是我非常基本的 uint128_t 类:

class uint128_t{
    private:
        uint64_t UPPER, LOWER;

    public:
    // constructors
        uint128_t(){
            UPPER = 0;
            LOWER = 0;
        }

        template <typename T>
        uint128_t(T val){
            UPPER = 0;
            LOWER = (uint64_t) val;
        }

        template <typename S, typename T>
        uint128_t(const S & upper_val, const T & lower_val){
            UPPER = (uint64_t) upper_val;
            LOWER = (uint64_t) lower_val;
        }

        uint128_t(uint128_t val){
            UPPER = val.upper();
            LOWER = val.lower();
        }

        uint64_t upper(){
            return UPPER;
        }

        uint64_t lower(){
            return LOWER;
        }
};

如果操作员在课堂上,他们工作正常。但是,我可以做到uint128_t ^ uint32_t,但不能做到uint32_t ^ uint128_t。另一方面,将所有东西移到外面给我error: 'uint128_t operator=(uint128_t, T)' must be a nonstatic member function。此外,operator= 显然不适用于常量输入,因为值将是 ULLL,它不存在,除非有人知道这样做的方法。

我该怎么办?

【问题讨论】:

  • 这个编译?它不应该。您的复制构造函数是非法的。它按值传递参数,但这是不可能的,因为除非你已经有一个复制构造函数,否则你不能按值传递参数。它应该通过 const 引用接受它的参数。事实上,你甚至不应该定义它,因为在这种情况下默认的复制构造函数可以正常工作。

标签: c++ operator-overloading


【解决方案1】:

为什么不两者兼而有之? 将 operator= 放在里面,其余的放在外面。

对于将 uint128_t 作为左侧参数的那些,它并不重要,如果它是右侧参数,那么它必须是一个全局函数。因此,出于这个原因,如果它们是全局的,您可以将这两个函数并排放置。你甚至可以用一个聪明的宏来为两者都有一个实现,即使只是用于可交换的。

【讨论】:

  • 我想我会把 rhs 函数放在外面。你能回答另一个关于这个的问题吗?生病为它创建一个新线程
【解决方案2】:

一般来说,最好将它们放在外面,因此对于带有 Y 类型的隐式构造函数的 class X,单个函数 operator+(X&amp;, const X&amp;) 允许您添加 X 和 Y ala x + yy + x。如果你能找到一种方法——并且希望——使x + y 和/或y + xx + x 更快,那么无论如何你可能需要单独的函数。要记住的一件事:有一个operator+= 成员函数然后在执行+= rhs 之后返回lhs(左侧值)的临时副本方面实现+ 通常是件好事....

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    • 1970-01-01
    • 2016-04-08
    • 2012-06-02
    • 2014-01-14
    • 2013-03-23
    相关资源
    最近更新 更多