| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Oscar Invitado
|
Publicado: Lun 22 Mar, 2004 5:11 pm Asunto: Cómo puedo ampliar una clase de las predefinidas? |
|
|
Mi duda es esta:
Para un proyecto que tengo que hacer, me viene muy bien añadirle ciertas variables y ciertos métodos a la clase predefinida TSpeedButton.
Lo que he hecho es añadirle estas cosas mediante:
class TBotonNuevo:public TSpeedButton
{ //Lonuevo
};
Luego creo una variable de esa clase mediante:
TBotonNuevo *unboton;
Esto me compila bien, pero cuando voy a usar la variable, que tengo que reservar memoria para el botón, he probado de todas estas maneras:
1) unboton=new TBotonNuevo (this);
2) unboton=new TBotonNuevo ();
3) unboton=new TBotonNuevo;Pero en todos los casos me sale el error siguiente:
[C++ Error] Usuario.cpp(50): E2125 Compiler could not generate default constructor for class 'TfUsuario::TBotonNuevo'
¿Alguien me puede decir cómo solucionar esto para poder usar la clase nueva TBotonNuevo de la misma manera que usaba la clase predefinida TSpeedButton?.
Gracias. |
|
| Volver arriba |
|
 |
masBecas Lt

Registrado: 23 Oct 2003Mensajes: 98Ubicación: La Laguna, Tenerife
|
Publicado: Lun 22 Mar, 2004 5:46 pm Asunto: |
|
|
Bueno, es una idea, pero ¿has probado a declarar un constructor por defecto dentro de tu nueva clase?
Me explico: la clase TSpeedButton tiene sus propios constructores pero lo más correcto sería que te declararas tus propios constructores en la clase extendida de la siguiente forma:
| Código: |
class TBotonNuevo:public TSpeedButton
{
TBotonNuevo(Classes::TComponent* AOwner) {
super(AOwner); // Invocamos al constructor del padre
}
}; |
|
|
| Volver arriba |
|
 |
Oscar Invitado
|
Publicado: Lun 22 Mar, 2004 10:27 pm Asunto: Lo he probado |
|
|
Hola, lo acabo de probar y me salen estos errores:
[C++ Error] Usuario.h(53): E2113 Virtual function 'TfUsuario::TBtonNuevo::TBtonNuevo(TComponent *)' conflicts with base class 'TSpeedButton'
[C++ Error] Usuario.h(53): E2251 Cannot find default constructor to initialize base class 'TSpeedButton'
[C++ Error] Usuario.h(54): E2268 Call to undefined function 'super'
no sé, yo estoy perdido, ¿se te ocurre algo?.
Gracias. |
|
| Volver arriba |
|
 |
masBecas Lt

Registrado: 23 Oct 2003Mensajes: 98Ubicación: La Laguna, Tenerife
|
Publicado: Mar 23 Mar, 2004 9:54 am Asunto: |
|
|
Lo siento, es fallo mío, que últimamente estoy mucho con Java.
Como deberías hacerlo realmente es:
| Código: |
class TBotonNuevo:public TSpeedButton
{
TBotonNuevo(Classes::TComponent* AOwner) : TSpeedButton(AOwner) {}
// Y si te sigue dando la lata con el constructor por defecto añade:
TBotonNuevo() : TSpeedButton() {}
};
|
|
|
| Volver arriba |
|
 |
Oscar Invitado
|
Publicado: Mar 23 Mar, 2004 11:40 am Asunto: Esto es que no se acaba nunca... |
|
|
He puesto lo que me dices y me sale el error:
[C++ Error] Usuario.h(52): E2113 Virtual function 'TfUsuario::TBotonNuevo::TBotonNuevo(TComponent *)' conflicts with base class 'TSpeedButton'
Si le añado lo que me dices más abajo me sale además del anterior, el error:
[C++ Error] Usuario.h(55): E2285 Could not find a match for 'TSpeedButton::TSpeedButton()'
A ver si poco a poco se va arreglando.
Gracias. |
|
| Volver arriba |
|
 |
masBecas Lt

Registrado: 23 Oct 2003Mensajes: 98Ubicación: La Laguna, Tenerife
|
Publicado: Mar 23 Mar, 2004 1:28 pm Asunto: |
|
|
La verdad que yo también estoy un poco desconcertado. Lo único que te puedo decir es que el segundo error viene derivado de que la clase TSpeedButton no tiene un constructor sin parámetros. Así q para quitar el segundo mensaje de error probablemente tengas que hacer:
| Código: |
// Nos comemos el " : TSpeedButton()"
TBotonNuevo() {}
|
Puesto que el constructor que lleva parámetros es "virtual" creo que el primer error también es normal pq estás intentando invocarlo desde tu nuevo constructor. Olvídate en este caso también de la llamada al constructor del padre.
| Código: |
TBotonNuevo(Classes::TComponent* AOwner) {}
|
Probablemente sólo con este constructor no te haga falta poner el primero (sin parámetros).
Si sigue sin funcionar la verdad que ya no sé, pero yo que tú miraría en la ayuda del Builder la jerarquía de clases del TSpeedButton y los constructores del TSpeedButton, para ver si te dan alguna idea.
También puedes buscar en este foro ayuda sobre como extender controles, que creo haber leido un par de cosas sobre el tema. |
|
| Volver arriba |
|
 |
Oscar Invitado
|
Publicado: Mar 23 Mar, 2004 7:03 pm Asunto: Nada, que no sale |
|
|
He probado con lo que me has dicho y me salen exactamente los mismos errores. Miraré a ver si en la ayuda o en algún sitio más encuentro algo que me dé aunque sea una pista...
De todas formas, gracias por tu tiempo y un saludo. |
|
| Volver arriba |
|
 |
LordNemesis Master


Registrado: 31 Dic 2003Mensajes: 340Ubicación: México
|
Publicado: Jue 25 Mar, 2004 5:47 pm Asunto: Solucion |
|
|
Lo único qu et efalta agregar es la palabra reservada __fastcall que se usa para las clases pertenecientes a la VCL, prueba, no te va a dar problemas... La declaracion de la clase y el constructor es como sigue:
| Código: |
class NuevoBoton : public TSpeedButton
{
public:
__fastcall NuevoBoton(TComponent *AOwner);
};
__fastcall NuevoBoton::NuevoBoton(TComponent *AOwner)
:TSpeedButton(AOwner)
{
}
|
Y para crear el objeto es:
| Código: |
NuevoBoton b = new NuevoBoton(this);
|
Donde this lo puedes subsituir por cualquier otro objeto descendiente de laclase TComponent _________________ Dirección Municipal de Informática
H. Ayuntamiento de Tijuana
Arriba Lopez Obrador !!!
Los Mexicanos Merecemos Respeto !!! |
|
| Volver arriba |
|
 |
Oscar Invitado
|
Publicado: Lun 29 Mar, 2004 10:12 am Asunto: Nuevos errores |
|
|
Cuando pongo el código siguiente en la definición del constructor
| Código: | __fastcall TBotonNuevo::TBotonNuevo(TComponent* AOwner)
{
} |
me sale el error:
[C++ Error] Usuario.h(61): E2089 Identifier '{' cannot have a type qualifier
Si además le añado el :TSpeedButton(AOwner) me dice:
[C++ Error] Usuario.h(60): E2312 'TSpeedButton' is not an unambiguous base class of 'TfUsuario'
Nota: TfUsuario es la clase del Form en el que estoy.
Me avisa también de que hay una declaración múltiple con:
[C++ Error] Usuario.h(84): E2238 Multiple declaration for '_fastcall TfUsuario::TfUsuario(TComponent *)'
y me refiere este error al código:
| Código: | __fastcall TfUsuario(TComponent* Owner); |
que es, supongo, la declaración del constructor del form en el que estoy, y que lo pone automáticamente el IDE al final.
Luego me dice que hay una declaración anterior de esto con el error:
[C++ Error] Usuario.h(60): E2344 Earlier declaration of '_fastcall TfUsuario::TfUsuario(TComponent *)'
y me la refiere a la definición del constructor de la clase TBotonNuevo que indiqué arriba.
Y por último, referido al mismo código anterior, me da el error:
[C++ Error] Usuario.h(61): E2251 Cannot find default constructor to initialize base class 'TForm'
No sé qué diantres pasa con esto pero yo es que no me explico los errores que me salen, ya casi estaba convencido de que me iba a salir...
Bueno, si a alguno se le enciende la bombilla y se le ocurre algo... se lo agradecería. |
|
| Volver arriba |
|
 |
LordNemesis Master


Registrado: 31 Dic 2003Mensajes: 340Ubicación: México
|
Publicado: Lun 29 Mar, 2004 7:20 pm Asunto: |
|
|
El ejemplo que te pase funciona sin ningun problema. Lo probe y funciono.
Tal vez deberias pegar tu codigo para saber como exactamente lo estas poniendo, porque a juzgar por los mensajes, creo que andas por ahi mezclando varias cosillas por lo que te sale el error.
Saludos _________________ Dirección Municipal de Informática
H. Ayuntamiento de Tijuana
Arriba Lopez Obrador !!!
Los Mexicanos Merecemos Respeto !!! |
|
| Volver arriba |
|
 |
|