Mi pregunta es simple. Cuando necesitamos tener un constructor por defecto?
Por favor, consulte el siguiente código:

class Shape
{
    int k;

public:
    Shape(int n) : k(n) {}
    ~Shape() {}
};

class Rect : public Shape
{
    int l;

public:
    Rect(int n): l(n)
    {}      //error C2512: 'Shape' : no appropriate default constructor available

    ~Rect() {}
};
  1. ¿Por qué es que el compilador no genera el cero argumento constructor por defecto de forma implícita en la clase Rect?
  2. Según mi conocimiento, si una clase (Rect) es derivada de otra clase (Forma) que ha constructor por defecto (ya sea implícitamente se genera o expresa), el constructor por defecto debe ser generado por el compilador.
Donde es la parte donde se construye el objeto Rect? Probablemente usted cree como ‘Rect rec;’ que necesita un defecto contructor.
Si mal no recuerdo, si no se especifica un contructor el compilador creará un valor predeterminado para usted. Pero si se especifica uno, es sólo tienen una.
cto r == constructor … ¡ahhhh!
@das_weezul: …?
Sí tiene usted razón; pero yo estaba asumiendo que ‘Rect rec’ podría utilizar el valor predeterminado cto r suministrados por el compilador

OriginalEl autor XMarshall | 2011-03-31

7 Comentarios

  1. 21

    Un constructor por defecto no es sintetizada si ha creado su propio constructor con argumentos. Desde que dio a Shape un constructor de su propio, usted tendría que escribir explícitamente un defecto Shape constructor de ahora:

    class Shape
    {
          int k;
    
      public:
          Shape() : k(0) {}
          Shape(int n) : k(n) {}
          ~Shape() {}
    };

    (Puede dejar de lado el vacío ~Rect() {} definiciones, ya que estos serán sintetizados.)

    Sin embargo, a mí me parece que no quiere un constructor por defecto de Forma. Han Rect construir el Shape base correctamente:

    class Shape
    {
          int area; //I've had to guess at what this member means. What is "k"?!
    
      public:
          Shape(int n) : area(area) {}
    };
    
    class Rect : public Shape
    {
         int l;
         int w;
    
      public:
         Rect(int l, int w) : Shape(l*w), l(l), w(w) {}
    };

    También observe que en este ejemplo es citado con frecuencia como un abuso de la OO. Considere si usted realmente necesidad herencia aquí.

    OriginalEl autor Lightness Races in Orbit

  2. 11

    Un constructor por defecto sólo será generado automáticamente por el compilador si no hay otros constructores están definidos. Independientemente de cualquier herencia.

    Y también es necesario para la construcción de su clase base, llamando al:

    Rect( int n ) : Shape( n ), l(n)
    {
    }

    OriginalEl autor Nick

  3. 2

    El compilador va a definir un valor predeterminado cto r si y sólo si no se declara explícitamente cualquier ctors.

    Tenga en cuenta que lo importante es declarar el constructor, no necesariamente la definición de la misma. Es bastante común que, por ejemplo, para declarar un privado cto r, y nunca lo definen, para evitar que el compilador implícitamente la definición de todos los demás.

    Edit: También tenga en cuenta que C++11 tiene un =default sintaxis para lidiar con situaciones como la suya.

    >para declarar un privado cto r, y nunca lo definen, para evitar que el compilador implícitamente la definición de todos los demás. Puede usted explicar con un ejemplo?
    Supongo que podría, pero no me atrevo a hacerlo–C++11 añadido un = delete; sintaxis que normalmente es el preferido en el nuevo código: class foo { int foo() = delete; }; evitará que el compilador a partir de la definición de un defecto cto r para foo. Usted puede conseguir el mismo efecto mediante la declaración de un privado cto r, pero la = delete; sintaxis expresa la intención más directamente, por lo que recomendamos el uso de ella, a menos que usted realmente necesita compatibilidad con antiguos (pre-c++11) compiladores.
    Si me ofrecen un constructor parametrizado en la clase, que impide que el compilador a partir de la definición de un constructor predeterminado. En tal caso, el compilador todavía implícito de constructor de copia y copia de asignación de constructor como sería en el caso de que yo no había presentado ningún constructor en todos?
    Eso es correcto, la definición de un constructor por defecto no afecta a si la copia cto r y/o copia operador de asignación se ha declarado implícitamente.

    OriginalEl autor Jerry Coffin

  4. 0

    El constructor por defecto se genera sólo si no ha definido ningún otro constructores.

    Supuestamente, si necesitas algún tipo de inicialización especial en la clase, el constructor por defecto no hacer lo correcto.

    OriginalEl autor Bo Persson

  5. 0

    Tal como se han definido un Constructor de la Forma que esperaba un entero que haya sobreescrito el constructor predeterminado por hacerlo. Así que si usted se extienden de Forma que usted debe pasar un valor entero a la superclase.

    OriginalEl autor das_weezul

  6. 0

    Compilador genera constructor predeterminado en caso de que cuando se tiene no se define ningún constructor. Pero si ha definido ningún constructor que toma un argumento o no. El compilador utilizará ese constructor y no generará constructor por defecto con cero argumento.

    OriginalEl autor Sarfraz Ahmed

Dejar respuesta

Please enter your comment!
Please enter your name here