Я пытаюсь сделать следующее:
foo* f = foo(1) + foo(2) + foo(3)
быть таким же, как
foo* f = new foo[3];
f[0] = foo(1);
f[1] = foo(2);
f[2] = foo(3);
код, который я должен сделать это:
foo*& operator+(foo f){
foo* ret = new foo[2];
ret[0] = *this;
ret[1] = f;
return ret;
}
который будет работать на двоих, но я хочу сделать это практически неограниченное количество. Я понятия не имею, с чего начать, и, поскольку я не знаю, как это называется, я не могу его найти.
Вы могли бы сделать то же самое с vector
:
#include <vector>
#include <iostream>
struct foo {
foo(int) {}
};
std::vector<foo>
operator+(const foo& lhs, const foo& rhs) {
std::vector<foo> v;
v.push_back(lhs);
v.push_back(rhs);
return v;
}
std::vector<foo>
operator+(std::vector<foo> lhs, const foo& rhs) {
lhs.push_back(rhs);
return lhs;
}
int main () {
std::vector<foo> f = foo(1) + foo(2) + foo(3);
}
Но я не могу представить, почему вы хотите.
Если вам нужен контейнер разного размера, просто используйте std :: vector следующим образом:
#include <iostream>
#include <vector>
class Foo
{
public:
Foo(int x) : x_(x) {}
private:
int x_;
}
int main(int argc, char* argv[])
{
std::vector<Foo> fooContainer;
fooContainer.push_back(Foo(1));
fooContainer.push_back(Foo(2));
fooContainer.push_back(Foo(3));
return 0;
}
Это может быть не так удобно, как использование версии вашего оператора, но есть несколько причин, по которым вам все равно не следует его использовать. Прежде всего, вы не должны использовать указатели (по крайней мере, не «голые») и должны избегать новых операторов из-за очень высокого риска утечек памяти. Другая причина в том, что использование вами оператора + на самом деле не представляет операцию суммирования. При перегрузке операторов вы должны заставить их действовать так же, как на примитивных типах. Когда вы делаете «2 + 3», результат равен 5 или сумме. То, что вы заставляете оператор + делать здесь, это не сумма, которую вы создаете контейнером из элементов, и это отличается от ожидаемого значения оператора +.