vacio una ser puede privados privado por parametrizado herencia heredada defecto constructores clase c++ constructor aggregation

c++ - una - herencia de constructores c#



llamando al constructor de un miembro de la clase en el constructor (5)

A través de la lista de inicializadores, si la clase base no tiene un constructor predeterminado .

struct foo{ foo( int num ) {} }; struct bar : foo { bar( int x ) : foo(x) // ^^^^^^ initializer list {} };

¿Puedo llamar al constructor de un miembro en el constructor de mi clase?

digamos que si tengo una bar miembro de la clase, escriba foo en mi clase MClass . ¿Puedo llamar al constructor de la barra en el constructor de MClass? Si no es así, ¿cómo puedo inicializar mi barra de miembros?

Es un problema de inicialización de miembros en la composición (agregación).


Me gusta esto:

class C { int m; public: C(int i): m(i + 1) {} };

Si su constructor miembro quiere parámetros, puede pasarlos. Pueden ser expresiones hechas a partir de los parámetros de constructor de clase y tipos ya inicializados.

Recuerde : los miembros se inicializan en el orden en que se declaran en la clase, no en el orden en que aparecen en la lista de inicialización.


Sí tu puedes. Esto se hace en la lista de inicialización de su clase. Por ejemplo:

class MClass { foo bar; public: MClass(): bar(bar_constructor_arguments) {}; }

Esto construirá una bar con los argumentos pasados. Normalmente, los argumentos serán otros miembros de su clase o argumentos que fueron pasados ​​a su constructor. Esta sintaxis es necesaria para cualquier miembro que no tenga constructores sin argumento.


Sí, ciertamente puedes! Para eso está la lista de inicializadores del constructor . Esta es una característica esencial que necesita para inicializar miembros que no tienen constructores predeterminados, así como constantes y referencias:

class Foo { Bar x; // requires Bar::Bar(char) constructor const int n; double & q; public: Foo(double & a, char b) : x(b), n(42), q(a) { } // ^^^^^^^^^^^^^^^^^^^ };

Además, necesita la lista de inicializadores para especificar un constructor no predeterminado para las clases base en los constructores de clases derivadas.


Sí tu puedes:

#include <iostream> using std::cout; using std::endl; class A{ public: A(){ cout << "parameterless" << endl; } A(const char *str){ cout << "Parameter is " << str <<endl; } }; class B{ A _argless; A _withArg; public: // note that you need not call argument-less constructor explicitly. B(): _withArg("42"){ } }; int main(){ B b; return 0; }

El resultado es:

parameterless Parameter is 42

Ver esto en ideone.com