使用重载的'*'运算符创建多个副本

时间:2016-10-21 13:21:21

标签: c++ constructor copy-constructor

我要做的是使用乘法运算符来创建对象的多个副本实例。

myclass instance;
instance * 5;

将创建5个实例副本。所以我使用对象数组来创建这些实例。

cube* operator* (int i, const cube& thing) {
        cube* objectarr = new cube[i];
        for (int j = 0; j < i; j++) {
            objectarr[i] = thing;
        }
        std::cout << i << " number of copies created\n";
        return objectarr;
    }

但是我收到一条错误,说“此功能的参数太多”。 但是,如果我将它设为好友函数,那么它可能需要多个参数。 当我尝试执行一个例子时出现问题。

#include <iostream>

#define TB '\t'
struct cube {
    int height;
    int width;
    int bredth;
    cube() {
        height = 0;
        width = 0;
        bredth = 0;
    }
    cube(int i, int j, int k) {
        height = i;
        width = j;
        bredth = k;
    }
    cube operator+=(const cube& c);
    friend cube* operator* (int i, const cube& thing) {
        cube* objectarr = new cube[i];
        for (int j = 0; j < i; j++) {
            objectarr[i] = thing;
        }

        std::cout << i << " number of copies created\n";
        return objectarr;
    }
};

int main() {
    cube c1(10, 20, 30);
    cube* mptr = new cube;
    mptr = 4 * c1;
    for (int i = 0; i < 4; i++) {
        std::cout << mptr[i].height << TB << mptr[i].width << TB << mptr[i].bredth << std::endl;
    }
    return 0;
}

上面代码的输出是这个。

4 number of copies created
0       0       0
0       0       0
0       0       0
0       0       0

我想知道

1。为什么会发生这种情况?

2。为什么乘法运算符不能使用多个参数,除非它是一个友元函数(我在网上搜索但很少了解它)?

谢谢

4 个答案:

答案 0 :(得分:0)

  1. 这是操作员滥用,只需使用复制构造函数。
  2. $('#select1').on('click', function(){ var option = $('option:selected', this); $('option:selected', this).remove(); selectClone1.splice($.inArray( option[0], selectClone1 ), 1); }); instance * 5不同。你有后者。

答案 1 :(得分:0)

我不能害怕。

重载时,不允许更改运算符的 arity 。这意味着您无法调整参数的数量。

您所引用的<?php $arr_a = array('1','2','3','4','5','6'); $arr_b = array('apples','oranges','bananas','peaches'); // How many elements are in the array we are inserting into $count = count($arr_a); // What was the last insert position? Make sure the next will be greater than this $prev = 0; // Loop through each of our elements to insert foreach($arr_b as $value) { // Generate a random value, higher than the previous // random number but still less than count($arr_a) $rand = rand($prev, $count); // Store this as the previous value + 1 $prev = $rand + 1; // Insert our value into $arr_a at the random position array_splice($arr_a, $rand, 0, $value); } echo "<pre>".print_r($arr_a, true)."</pre>"; 函数将与“类外”范围内特定类的重载乘法运算符的版本相关:因此采用2个参数

答案 2 :(得分:0)

你宁愿使用设计模式&#39;工厂创建类的多个实例。

&#39; *&#39;运营商不打算这样做。

答案 3 :(得分:0)

如果重载是成员,*this是操作员的左侧,并且只有一个显式参数。
如果你想让左手参数不是你的类,你必须使重载成为一个自由函数。

例如,如果你有

struct A
{
     int operator *(int x) { return x * y; } 
     int y;
};

int operator*(int x, A a) { return a.y * x }


A a{2};

然后

int z = a * 2; 

调用a.operator*(2),而

int w = 2 * a;

致电operator*(2, a)

您的特定运营商的更好实施将是

std::vector<cube> operator* (int i, const cube& thing) 
{
    return std::vector<cube>(i, thing);
}

或者如果你想要对称:

struct cube
{
   // ...
   std::vector<cube> operator*(int i) const { return std::vector<cube>(i, *this); }
};

std::vector<cube> operator* (int i, const cube& thing) 
{
    return thing * i;
}