Ответ 1
Это возможно с недавно опубликованным С++ 11, но компилятор С++ еще не реализовал эту функцию.
Один из краеугольных камней ООП - это повторное использование кода, а не повторение его снова и снова. Таким образом, ваши проекты сокращаются и становятся более читабельными.
С++ предоставляет вам все инструменты, необходимые для повторного использования методов вместо повторения кода. Хотя, когда дело доходит до конструкторов, я не знаю, как их повторно использовать.
Я не говорю о наследии или о том, как отправить сообщение отцу. Я говорю о повторном использовании конструктора самого класса.
Аналогия в JAVA выглядит примерно так:
public Foo() {
this(0,0,0);//Not needed in this case, just to clarify
}
public Foo(Foo f){
this(f.getA(), f.getB(), f.getC());
}
public Foo(int a, int b, int c) {
this.a = a;
this.b = b;
this.c = c;
}
Мой вопрос: есть ли какой-нибудь синтаксис в С++, который позволяет это сделать?
Это возможно с недавно опубликованным С++ 11, но компилятор С++ еще не реализовал эту функцию.
Другие уже ответили на вопрос о С++ 11, но для С++ 03 существует возможное обходное решение: использование базового класса с необходимым конструктором.
struct foo_base {
foo_base(int a, int b, int c) : a(a), b(b), c(c) { }
int a, b, c;
};
struct foo : foo_base {
foo() : foo_base(0, 0, 0) { }
foo(const foo& other) : foo_base(other.a, other.b, other.c) { }
foo(int a, int b, int c) : foo_base(a, b, c) { }
};
Конечно, вам нужно подумать над тем, стоит ли это шаблон для ваших целей.
С++ 11 добавил делегирование конструктора и наследование конструктора.
Для наследования конструкторов требуется объявление об использовании:
class Base { ... };
class Derived : public Base
{
using Base::Base;
};
Для делегирования используйте инициализатор ctor, но укажите другой конструктор в том же классе вместо любых подобъектов (все базовые и подчиненные подобъекты будут инициализированы делегированным конструктором):
class Another : public Base
{
int member;
Another(int x)
: Base(), member(x) // non-delegating constructor initializes sub-objects
{}
Another(void)
: Another(5) // delegates -- other constructor takes care of Base and member
{}
};
И идеальная пересылка также может пригодиться.
Общепринятая душа для текущих компиляторов должна сделать это:
class Bar{
pubilc:
Foo() {
init(0,0,0);
}
Foo(const Foo &f){
init(f.getA(), f.getB(), f.getC());
}
Foo(int a, int b, int c) {
init(a,b,c);
}
private:
void init(int a, int b, int c){
this->a = a;
this->b = b;
this->c = c;
}
};
Хотя в этом примере это может показаться чрезмерным, это связано только с простотой примера. В реальном мире это действительно принесет пользу с точки зрения сокращения повторяющегося кода.
OK С++ 11 охватывает то, что вам нужно.
Но ваш простой случай имеет простое решение:
/* This one is covered by providing default parameters see below.
public Foo() {
this(0,0,0);//Not needed in this case, just to clarify
}
This is done automatically by the compiler.
You do not need to write any code for this:
public Foo(Foo f){
this(f.getA(), f.getB(), f.getC());
}
The compiler generated version actually looks like this:
public Foo(Foo const& f)
: a(f.a)
, b(f.b)
, c(f.c)
{}
*/
// Now you can use all three methods and they work fine:
public Foo(int a = 0, int b = 0, int c = 0)
: a(a)
, b(b)
, c(c)
{}
F f1; // default construct no parameters: uses the three parameter version
F f2(f1); // Copy constructed. Generated by the compiler.
F f3(1,2,3); // Nomal constructor