Autor
|
Tema: Creo que tengo un problema de constructores (Leído 4,750 veces)
|
anonimo12121
|
Hola buenas estoy dividiendo el proyectos en varios cpp y hpp y bueno me esta dando problema lo siguiente y no se por qué!. pongo primero un trozo del code y luego el error. Los constructores Menu(sf::RenderWindow *r,float x,float y,const sf::Unicode::Text &text,bool s); Menu(sf::RenderWindow *r,float x,float y,float w,float h,bool s);
[b]Donde lo invoco por primera vez![/b] [code=cpp] Menu Pausa(&app,0,0,290,350); Menu Inicio(&app,0,0,"img/logo.png"); ... ku\headers\gui.hpp|13|error: la conversión de 'int' a 'const sf::Unicode::Text' es ambigua| ku\headers\gui.hpp|13|nota: los candidatos son:| c:\mingw\bin\..\lib\gcc\mingw32\4.6.2\..\..\..\..\include\SFML\System\Unicode.hpp|83|nota: sf::Unicode::Text::Text(const Uint32*) <coincidencia cercana>| c:\mingw\bin\..\lib\gcc\mingw32\4.6.2\..\..\..\..\include\SFML\System\Unicode.hpp|83|nota: no hay una conversión conocida para el argumento 1 de 'int' a 'const Uint32* {aka const unsigned int*}'| c:\mingw\bin\..\lib\gcc\mingw32\4.6.2\..\..\..\..\include\SFML\System\Unicode.hpp|82|nota: sf::Unicode::Text::Text(const Uint16*) <coincidencia cercana>| c:\mingw\bin\..\lib\gcc\mingw32\4.6.2\..\..\..\..\include\SFML\System\Unicode.hpp|82|nota: no hay una conversión conocida para el argumento 1 de 'int' a 'const Uint16* {aka const short unsigned int*}'| c:\mingw\bin\..\lib\gcc\mingw32\4.6.2\..\..\..\..\include\SFML\System\Unicode.hpp|81|nota: sf::Unicode::Text::Text(const Uint8*) <coincidencia cercana>| c:\mingw\bin\..\lib\gcc\mingw32\4.6.2\..\..\..\..\include\SFML\System\Unicode.hpp|81|nota: no hay una conversión conocida para el argumento 1 de 'int' a 'const Uint8* {aka const unsigned char*}'| c:\mingw\bin\..\lib\gcc\mingw32\4.6.2\..\..\..\..\include\SFML\System\Unicode.hpp|80|nota: sf::Unicode::Text::Text(const wchar_t*) <coincidencia cercana>| c:\mingw\bin\..\lib\gcc\mingw32\4.6.2\..\..\..\..\include\SFML\System\Unicode.hpp|80|nota: no hay una conversión conocida para el argumento 1 de 'int' a 'const wchar_t*'| c:\mingw\bin\..\lib\gcc\mingw32\4.6.2\..\..\..\..\include\SFML\System\Unicode.hpp|79|nota: sf::Unicode::Text::Text(const char*) <coincidencia cercana>| c:\mingw\bin\..\lib\gcc\mingw32\4.6.2\..\..\..\..\include\SFML\System\Unicode.hpp|79|nota: no hay una conversión conocida para el argumento 1 de 'int' a 'const char*'| ku\headers\interfaz.hpp|80|error: se inicializa el argumento 4 de 'Menu::Menu(sf::RenderWindow*, float, float, const sf::Unicode::Text&, bool)'| ku\headers\gui.hpp|14|error: no se encontró una función coincidente para la llamada a 'Menu::Menu(sf::RenderWindow*, int, int, const char [13])'| ku\headers\gui.hpp|14|nota: los candidatos son:| ku\headers\interfaz.hpp|81|nota: Menu::Menu(sf::RenderWindow*, float, float, float, float, bool)| ku\headers\interfaz.hpp|81|nota: el candidato espera 6 argumentos, se proporcionaron 4| ku\headers\interfaz.hpp|80|nota: Menu::Menu(sf::RenderWindow*, float, float, const sf::Unicode::Text&, bool)| ku\headers\interfaz.hpp|80|nota: el candidato espera 5 argumentos, se proporcionaron 4| ku\headers\interfaz.hpp|59|nota: Menu::Menu(const Menu&)| ku\headers\interfaz.hpp|59|nota: el candidato espera 1 argumento, se proporcionaron 4| ku\headers\gui.hpp|20|error: la conversión de 'int' a 'const sf::Unicode::Text' es ambigua| ku\headers\gui.hpp|20|nota: los candidatos son:| c:\mingw\bin\..\lib\gcc\mingw32\4.6.2\..\..\..\..\include\SFML\System\Unicode.hpp|83|nota: sf::Unicode::Text::Text(const Uint32*) <coincidencia cercana>| c:\mingw\bin\..\lib\gcc\mingw32\4.6.2\..\..\..\..\include\SFML\System\Unicode.hpp|83|nota: no hay una conversión conocida para el argumento 1 de 'int' a 'const Uint32* {aka const unsigned int*}'| c:\mingw\bin\..\lib\gcc\mingw32\4.6.2\..\..\..\..\include\SFML\System\Unicode.hpp|82|nota: sf::Unicode::Text::Text(const Uint16*) <coincidencia cercana>| c:\mingw\bin\..\lib\gcc\mingw32\4.6.2\..\..\..\..\include\SFML\System\Unicode.hpp|82|nota: no hay una conversión conocida para el argumento 1 de 'int' a 'const Uint16* {aka const short unsigned int*}'| c:\mingw\bin\..\lib\gcc\mingw32\4.6.2\..\..\..\..\include\SFML\System\Unicode.hpp|81|nota: sf::Unicode::Text::Text(const Uint8*) <coincidencia cercana>| c:\mingw\bin\..\lib\gcc\mingw32\4.6.2\..\..\..\..\include\SFML\System\Unicode.hpp|81|nota: no hay una conversión conocida para el argumento 1 de 'int' a 'const Uint8* {aka const unsigned char*}'| c:\mingw\bin\..\lib\gcc\mingw32\4.6.2\..\..\..\..\include\SFML\System\Unicode.hpp|80|nota: sf::Unicode::Text::Text(const wchar_t*) <coincidencia cercana>| c:\mingw\bin\..\lib\gcc\mingw32\4.6.2\..\..\..\..\include\SFML\System\Unicode.hpp|80|nota: no hay una conversión conocida para el argumento 1 de 'int' a 'const wchar_t*'| c:\mingw\bin\..\lib\gcc\mingw32\4.6.2\..\..\..\..\include\SFML\System\Unicode.hpp|79|nota: sf::Unicode::Text::Text(const char*) <coincidencia cercana>| c:\mingw\bin\..\lib\gcc\mingw32\4.6.2\..\..\..\..\include\SFML\System\Unicode.hpp|79|nota: no hay una conversión conocida para el argumento 1 de 'int' a 'const char*'| ku\headers\interfaz.hpp|80|error: se inicializa el argumento 4 de 'Menu::Menu(sf::RenderWindow*, float, float, const sf::Unicode::Text&, bool)'| ||=== Build finished: 34 errors, 0 warnings ===|[/code] pongo el code de la clase completo aquiclass Menu { private: sf::RenderWindow *_App; bool _On; sf::Shape _Rect; sf::Color _CD; int _NumberElement;// sf::Font _Font; bool _ElementType[10];// true dynamic, false static Subrayado _Sub; int _ElementClick; int _ElementAbove; sf::Image _Ibg; sf::Sprite _Sbg; bool _MenuType;//true image. false shader //Sonidos Sonido _S[2]; bool _SoundOn;//true hay sonido, false no hay sonido int _ElementLoop; public: sf::String _Element[10]; Menu(sf::RenderWindow *r,float x,float y,const sf::Unicode::Text &text,bool s); Menu(sf::RenderWindow *r,float x,float y,float w,float h,bool s); void Print(); void SetState(bool x);//true or false bool GetState();//true or false void AddElement(const sf::Unicode::Text &Text,float size,bool t);//bool tyoe static or dynamic void SetPosition(int ele,float x,float y); bool Comprobar(float x,float y,bool &click); int GetClick(); void SetClick(int i); void SetSound(const sf::Unicode::Text &text,int x); };
|
|
|
En línea
|
|
|
|
Beakman
|
Antes que nada, estás enlazando bien estás librerías ?: sfml-graphics, sfml-window, sfml-system.Al primer constructor: Menu( sf::RenderWindow *r,float x,float y,const sf::Unicode::Text &text,bool s);
Lo llamás de esta forma: Menu Inicio(&app,0,0,"img/logo.png");
Te falta un parámetro para bool s. ALgo así: Menu Inicio(&app,0,0,"img/logo.png", true );
Pero tenés que poner más atención en la definición del método por si te olvidaste un parámetro. Tiene que ser así: Menu::Menu( sf::RenderWindow *r,float x,float y,const sf::Unicode::Text &text,bool s){ // código }
Al segundo constructor: Menu( sf::RenderWindow *r,float x,float y,float w,float h,bool s);
Lo llamás de esta forma: Menu Pausa(&app,0,0,290,350);
Lo mismo que el anterior. Te falta un valor bool. Y tenés que fijarte en la definición. No veo otro error en los constructores. Lo que deberías hacer es escribir un constructor sin parámetros y agregárselos( a los parámetros ) uno por uno mientras compilás.
|
|
|
En línea
|
|
|
|
anonimo12121
|
El problema solo me ocurre al ponerlo en varios cpp, antes declaraba y definía en cabeceras. Pero perdón la definición coge un valor default si no se le inserta no se si me estaré equivocando aquí pongo el código Qué quieres decir con ?.Lo que deberías hacer es escribir un constructor sin parámetros y agregárselos( a los parámetros ) uno por uno mientras compilás. Menu::Menu(sf::RenderWindow *r,float x,float y,float w,float h,bool s=false){ _Sub.Init(r); _Sub.Create(255,255,255,0,0,0,0); _Sub.Set(false); _Sub.Opacity(60); _CD.r=0; _CD.g=0; _CD.b=0; _CD.a=230; _App=r; _Rect.AddPoint(x,y,_CD,_CD); _Rect.AddPoint(x+w,y,_CD,_CD); _Rect.AddPoint(x+w,y+h,_CD,_CD); _Rect.AddPoint(x,y+h,_CD,_CD); _Font.LoadFromFile("ace_futurism.ttf"); _MenuType=false; _ElementClick= -1; _SoundOn=s; _ElementLoop=-1; _ElementAbove=-1; }; Menu::Menu(sf::RenderWindow *r,float x,float y,const sf::Unicode::Text &text,bool s=false){ _Sub.Init(r); _App=r; _Sub.Create(255,255,255,0,0,0,0); _Sub.Set(false); _Sub.Opacity(60); _Font.LoadFromFile("ace_futurism.ttf"); _Ibg.LoadFromFile("img/logo.png"); _Ibg.SetSmooth(false); _Sbg.SetImage(_Ibg); _Sbg.SetPosition(x,y); _MenuType=true; _ElementClick= -1; _SoundOn=s; _ElementLoop=-1; _ElementAbove=-1; }
|
|
« Última modificación: 4 Abril 2012, 22:29 pm por Dr.Hacker++ »
|
En línea
|
|
|
|
Beakman
|
Lo que decía era que hagas un constructor vacío, por ejemplo: Menu::Menu( sf::RenderWindow *r ){ // no hacer nada }
Y lo llamás: Menu Pausa( &app );
Lo compilás y si sale bien, le agregás de a uno los demás parámetros.
Tu código lo puse en un mismo archivo y me compiló bien. Lo puse así: #include<iostream> #include<SFML/Graphics.hpp> #include<iostream> class Subrayado{ public: bool Init( sf::RenderWindow *r ){ return true; }; bool Create( int a,int b,int c,int d,int e,int f,int g){ return true; } bool Set( bool a ){ return true; } bool Opacity( int a ){ return true; } }; class Sonido{ }; class Menu { private: sf::RenderWindow *_App; bool _On; sf::Shape _Rect; sf::Color _CD; int _NumberElement;// sf::Font _Font; bool _ElementType[10];// true dynamic, false static Subrayado _Sub; int _ElementClick; int _ElementAbove; sf::Image _Ibg; sf::Sprite _Sbg; bool _MenuType;//true image. false shader //Sonidos Sonido _S[2]; bool _SoundOn;//true hay sonido, false no hay sonido int _ElementLoop; public: sf::String _Element[10]; Menu(sf::RenderWindow *r,float x,float y,const sf::Unicode::Text &text,bool s); Menu(sf::RenderWindow *r,float x,float y,float w,float h,bool s); void Print(); void SetState(bool x);//true or false bool GetState();//true or false void AddElement(const sf::Unicode::Text &Text,float size,bool t);//bool tyoe static or dynamic void SetPosition(int ele,float x,float y); bool Comprobar(float x,float y,bool &click); int GetClick(); void SetClick(int i); void SetSound(const sf::Unicode::Text &text,int x); }; Menu::Menu(sf::RenderWindow *r,float x,float y,float w,float h,bool s=false){ _Sub.Init( r ); _Sub.Create(255,255,255,0,0,0,0); _Sub.Set(false); _Sub.Opacity(60); _CD.r=0; _CD.g=0; _CD.b=0; _CD.a=230; _App=r; _Rect.AddPoint(x,y,_CD,_CD); _Rect.AddPoint(x+w,y,_CD,_CD); _Rect.AddPoint(x+w,y+h,_CD,_CD); _Rect.AddPoint(x,y+h,_CD,_CD); _Font.LoadFromFile("ace_futurism.ttf"); _MenuType=false; _ElementClick= -1; _SoundOn=s; _ElementLoop=-1; _ElementAbove=-1; }; Menu::Menu(sf::RenderWindow *r,float x,float y,const sf::Unicode::Text &text,bool s=false){ _Sub.Init( r ); _App=r; _Sub.Create(255,255,255,0,0,0,0); _Sub.Set(false); _Sub.Opacity(60); _Font.LoadFromFile("ace_futurism.ttf"); _Ibg.LoadFromFile("img/logo.png"); _Ibg.SetSmooth(false); _Sbg.SetImage(_Ibg); _Sbg.SetPosition(x,y); _MenuType=true; _ElementClick= -1; _SoundOn=s; _ElementLoop=-1; _ElementAbove=-1; } int main(){ sf::RenderWindow app( sf::VideoMode( 100, 100,32 ), "ejemplo" ); Menu Pausa(&app,0,0,290,350); Menu Inicio(&app,0,0,"img/logo.png"); while( app.IsOpened() ){ sf::Event evento; while( app.GetEvent( evento ) ){ if( evento.Type == sf::Event::Closed )app.Close(); } app.Display(); } return 0; }
Le agregué las clases Sonido y Subrayado para no borrar la declaración de las variables y que quede igual a tu código. Si estás separando el código en hpp y cpp tal vez tenés un problema en las cabeceras. Te puede faltar un include en los cpps por ejemplo.
|
|
« Última modificación: 4 Abril 2012, 22:51 pm por CrisQC »
|
En línea
|
|
|
|
anonimo12121
|
Gracias cris por ayudarme. Estado modificando el code, y me da problema al tener el parametro bool con valor por defecto ;( voy a probar a hacer un proyecto con una clase de suma y que tenga valores por defecto. EDITO : El problema es que no puedo poner funciones que tengan la capacidad de tener el parametro por defecto mira lo que hicemain.cpp#include <iostream> using namespace std; #include "mat.hpp" mat m; int main(int argc, char *argv[]){ cout << m.suma(); cin.get(); return 0; }
mat.cpp#include "mat.hpp" int mat::suma(int x=3 , int x2=7){ return x+x2; }
mat.hppclass mat { private: public: int suma(int x, int x2); };
ErrorC:\Users\Tony\Desktop\prueba\main.cpp|6|error: no se encontró una función coincidente para la llamada a 'mat::suma()'| C:\Users\Tony\Desktop\prueba\main.cpp|6|nota: el candidato es:| C:\Users\Tony\Desktop\prueba\suma.hpp|4|nota: int mat::suma(int, int)| C:\Users\Tony\Desktop\prueba\suma.hpp|4|nota: el candidato espera 2 argumentos, se proporcionaron 0| ||=== Build finished: 4 errors, 0 warnings ===|
|
|
« Última modificación: 4 Abril 2012, 23:30 pm por Dr.Hacker++ »
|
En línea
|
|
|
|
Beakman
|
Intentá hacer esto. Hace el siguiente cambio: #include "mat.hpp" // int mat::suma(int x=3 , int x2=7){ // aca no pongas el valor por defecto int mat::suma(int x=3 , int x2 ){ // que te quede así. return x+x2; }
class mat { private: public: int suma(int x, int x2 = 7); // aca SI poné el valor por defecto. };
Estoy casi seguro de que así te va a servir. Intentalo. Y Por nada !!.
|
|
|
En línea
|
|
|
|
anonimo12121
|
Ok por fin xD que raro yo creo que antes cuando aprendí a usarlo lo usaba así X) al final hice gracias a ti esto: #include "suma.hpp" int mat::suma(int x, int x2){ return x+x2; }
class mat { private: public: int suma(int x=2, int x2=2); };
|
|
|
En línea
|
|
|
|
Beakman
|
Sí, si yo lo hago al revés me compila bien, es por el compilador que uses y la versión. Igual la forma correcta es cómo terminaste haciéndolo. Me alegro que lo hayas solucionado. Saludos !!
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Problema con herencia de constructores
Programación C/C++
|
Lord_Lobotomi
|
3
|
2,988
|
1 Marzo 2012, 05:22 am
por naderST
|
|
|
Creo que tengo problemas en la bios
Hardware
|
alejodel
|
6
|
4,342
|
23 Agosto 2012, 18:54 pm
por alejodel
|
|
|
creo que tengo un intruso en mi pc
« 1 2 »
Seguridad
|
sotobr
|
12
|
8,088
|
23 Noviembre 2013, 01:55 am
por sotobr
|
|
|
Problema con constructores y archivos c#
.NET (C#, VB.NET, ASP)
|
Kaxperday
|
3
|
2,644
|
4 Mayo 2015, 12:50 pm
por kub0x
|
|
|
Creo que me voy a pintar al gimnasio que por 9€ tengo todo incluido en el polideportivo!
Foro Libre
|
Terminator5
|
5
|
3,012
|
3 Noviembre 2023, 16:46 pm
por 4v1dy4
|
|