Se llama al constructor predeterminado en lugar del constructor parametrizado

Implementé una clase para el esquema de ponderación y he creado 4 constructores en la clase con un número diferente de parámetros. Cuando trato de invocar el constructor con el parámetro de un constructor en particular, también se llama al constructor predeterminado sin parámetros. No puedo entender por qué tal esto está sucediendo.

Definición de constructor:

593     UnigramLMWeight(double param_log_,int select_smoothing_,double param_smoothing1_,double param_smoothing2_)
594         : select_smoothing(select_smoothing_), param_log(param_log_), param_smoothing1(param_smoothing1_),
595           param_smoothing2(param_smoothing2_)
596         {

Llamada del constructor:

 79     enquire.set_weighting_scheme(Xapian::UnigramLMWeight(double(322.0),int(2),double(2000.0),double(2.0)));

Pero he comprobado que los valores que se establecen son del constructor predeterminado.

¿Puede alguien ayudarme por qué se llama a este constructor predeterminado o cada vez que se llama al constructor predeterminado después del constructor paramétrico o los parámetros se convierten en algún otro tipo y el constructor intenta encontrar dicho constructor pero no puede encontrar dicho constructor y llama al constructor predeterminado? por fin.

El código del esquema set_weigthing es:

 926 Enquire::set_weighting_scheme(const Weight &weight_)
 927 {
 928     LOGCALL_VOID(API, "Xapian::Enquire::set_weighting_scheme", weight_);
 929     // Clone first in case doing so throws an exception.
 930     Weight * wt = weight_.clone();
 931     swap(wt, internal->weight);
 932     delete wt;
 933 }

¿El método de configuración del esquema set_weighing llama a la función de clonación? ¿Es esta la raíz del problema cuando se llama al constructor predeterminado de clones? ¿Es así? ¿Puede ser esa la razón?

preguntado el 21 de mayo de 12 a las 19:05

hm, ¿para qué idioma querías esto? C#, C++ y C son bastante diferentes. No puede ser C (ya que estás hablando de objetos), y el :: es raro en el código C# 'normal'... Sospecho que quieres C++, pero tus etiquetas hacen que sea difícil saberlo:

Proporcione un programa de ejemplo mínimo y completo que demuestre el problema. -

@ChristopherPfohl es c ++, lo siento, se corrigieron las etiquetas... lo siento por agregar inicialmente esas etiquetas -

Es probable que tenga otros constructores y otro código de llamada. Lo que ha mostrado no llamaría exhibir este comportamiento, pero puede invocar el constructor de copia según la definición de set_weighting_scheme -

Básicamente, si desea ayuda, necesitamos ver el código de la función set_weighting_scheme ya que su problema innegablemente radica allí ... -

1 Respuestas

Cuando haces una copia del objeto (¿clonar?), se llama al constructor de copias. Parece que no ha implementado un constructor de copia personalizado, por lo que en su lugar se llama al predeterminado generado por el compilador.

UnigramLMWeight(const UnigramLMWeight& copy_from)
{
// implement copy here
}

http://login2win.blogspot.com/2008/05/c-copy-constructor.html podría ser útil

contestado el 21 de mayo de 12 a las 19:05

sí, no he implementado el constructor de copia, pero ¿cómo marcará la diferencia, ya que se usará el constructor de copia predeterminado y el constructor de copia predeterminado haría el valor del parámetro de copia bit a bit debería ser el mismo? Puede suceder en caso de que el constructor de copia simplemente llame al constructor predeterminado .... pero creo que implementar el constructor de copias es un buen intento, lo implementaré y veré si resuelve el problema: samuelhard

Mi función de clonación de clase tenía una implementación que llamaba al constructor predeterminado en algún otro archivo, por lo que cada vez que se configuraba más tarde mientras se llamaba al constructor predeterminado de clonación ... por lo tanto, los valores eran del constructor predeterminado ..... - samuelhard

gracias por la respuesta, problema resuelto, función de clonación reimplementada - samuelhard

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.