我要做的是使用乘法运算符来创建对象的多个副本实例。
即
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。为什么乘法运算符不能使用多个参数,除非它是一个友元函数(我在网上搜索但很少了解它)?
谢谢
答案 0 :(得分:0)
$('#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;
}