Creo que tengo un problema de constructores

Iniciado por anonimo12121, 4 Abril 2012, 16:42 PM

0 Miembros y 1 Visitante están viendo este tema.

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
Código (cpp) [Seleccionar]

        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 aqui
Código (cpp) [Seleccionar]
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);
};
Página para ganar Bitcoins y Dinero: http://earnbit.hol.es/
Video de YouTube con Hack para el LoL: http://adf.ly/5033746/youtube-lolemuhack
Si quieres ganar dinero con adfly entra y registrate aquí -> http://adf.ly/?id=5033746

Beakman

Antes que nada, estás enlazando bien estás librerías ?: sfml-graphics, sfml-window, sfml-system.

Al primer constructor:
Código (cpp) [Seleccionar]
Menu( sf::RenderWindow *r,float x,float y,const sf::Unicode::Text &text,bool s);

Lo llamás de esta forma:
Código (cpp) [Seleccionar]
Menu Inicio(&app,0,0,"img/logo.png");

Te falta un parámetro para bool s. ALgo así:
Código (cpp) [Seleccionar]
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í:
Código (cpp) [Seleccionar]

Menu::Menu( sf::RenderWindow *r,float x,float y,const sf::Unicode::Text &text,bool s){
     // código
}





Al segundo constructor:
Código (cpp) [Seleccionar]
Menu( sf::RenderWindow *r,float x,float y,float w,float h,bool s);

Lo llamás de esta forma:
Código (cpp) [Seleccionar]
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.

anonimo12121

#2
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 ?.
CitarLo que deberías hacer es escribir un constructor sin parámetros y agregárselos( a los parámetros ) uno por uno mientras compilás.

Código (cpp) [Seleccionar]
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;
}
Página para ganar Bitcoins y Dinero: http://earnbit.hol.es/
Video de YouTube con Hack para el LoL: http://adf.ly/5033746/youtube-lolemuhack
Si quieres ganar dinero con adfly entra y registrate aquí -> http://adf.ly/?id=5033746

Beakman

#3
Lo que decía era que hagas un constructor vacío, por ejemplo:
Código (cpp) [Seleccionar]
Menu::Menu( sf::RenderWindow *r ){
    // no hacer nada
}

Y lo llamás:
Código (cpp) [Seleccionar]
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í:
Código (cpp) [Seleccionar]
#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.

anonimo12121

#4
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 hice
main.cpp
Código (cpp) [Seleccionar]
#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
Código (cpp) [Seleccionar]
#include "mat.hpp"
int mat::suma(int x=3 , int x2=7){
    return x+x2;
}


mat.hpp
Código (cpp) [Seleccionar]
class mat {
    private:
    public:
        int suma(int x, int x2);
};


Error
C:\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 ===|
Página para ganar Bitcoins y Dinero: http://earnbit.hol.es/
Video de YouTube con Hack para el LoL: http://adf.ly/5033746/youtube-lolemuhack
Si quieres ganar dinero con adfly entra y registrate aquí -> http://adf.ly/?id=5033746

Beakman

Intentá hacer esto. Hace el siguiente cambio:
Código (cpp) [Seleccionar]
#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;
}


Código (cpp) [Seleccionar]
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 !!.

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:
Código (cpp) [Seleccionar]
#include "suma.hpp"
int mat::suma(int x, int x2){
    return x+x2;
}

Código (cpp) [Seleccionar]
class mat {
    private:
    public:
        int suma(int x=2, int x2=2);
};
Página para ganar Bitcoins y Dinero: http://earnbit.hol.es/
Video de YouTube con Hack para el LoL: http://adf.ly/5033746/youtube-lolemuhack
Si quieres ganar dinero con adfly entra y registrate aquí -> http://adf.ly/?id=5033746

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 !!