Compiler meckert wegen Konstruktor - Warum?



  • Also ich habe folgendes Problem. Wenn ich versuche zwei Klassen zu kompilieren meldet der Compiler folgenden Fehler

    'SmsText::SMSTextImpl' : no appropriate default constructor available

    Der Konstruktor von SMSTextImpl ist dieser:

    SMSTextImpl::
    SMSTextImpl()
    :g_hSMSAPIdll(NULL), 
     sms_sendsms(NULL),
     sms_sendbatch(NULL),
     sms_getreport(NULL),
     sms_getinbox(NULL),
     sms_getcredits(NULL),
     sms_initialize_defaults(NULL),
     text_("smstxt32.dll")
    {
    	this -> Init(this -> text_.c_str());
    }
    

    Der Fehler trifft in dieser Stelle:

    SmsText::SmsText()
    : pimpl_(new SMSTextImpl())
    {}
    

    Ich kann mir diesen Fehler nicht erklaeren, SMSTextImpl() hat doch keine Argumente. Wird vielleicht implizit ein anderer Konstruktor erwartet den die Klasse nicht zu bieten hat? Oder liegt der Fehler ganz wo anders? Die Klassen sind in diesen beiden Dateien untergebracht:
    smstest.h http://nopaste.com/p/aKVtnaosv
    smstest.cpp http://nopaste.com/p/a208X7Gd3
    Bin um jede Hilfe danbar.



  • Klasse lebt in anderer Klasse drin! 💡

    #include "testsms.h"
    #include "smsapi.h"
    
    class SMSText::SMSTextImpl
    {
    public:
            SMSTextImpl();
            ~SMSTextImpl();
    
            HINSTANCE                          g_hSMSAPIdll;
            SMSAPIFUNCTION_SENDSMS             sms_sendsms;
    ...
    
    SMSTEXT::SMSTextImpl::
    SMSTextImpl()
    :g_hSMSAPIdll(NULL), 
     sms_sendsms(NULL),
    ...
    


  • Der Gültigkeitsbereich von "Geschachtelten Klassen" die innerhalb der Klasse vereinbart werden sind auf diese Klasse beschränkt. Was du machst ist die globale Redefinition ausserhalb der Klasse. Für den Compiler existieren jetzt zwei Klassen SMSTextImpl eine SMSText::SMSTextImpl und eben SMSTextImpl, beim Aufruf kennt der Complier nur die Forward-Deklaration SMSText::SMSTextImpl und versucht eine Instanz davon zu erzeugen, aber das kann er nicht weil die Defefintion fehlt

    Um die Forward-Deklaration gültig aufzulösen musst du den namespace deiner Klasse voranstellen, damit die Klasse gültig aufgelöst werden kann:

    class SMSText::SMSTextImpl
    {
    public:
            SMSTextImpl();
            ~SMSTextImpl();
            void Cleanup();
    .
    .
    .
    
    };
    
    SMSText::SMSTextImpl::
    SMSTextImpl()
    :g_hSMSAPIdll(NULL), 
     sms_sendsms(NULL),
     sms_sendbatch(NULL),
     sms_getreport(NULL),
     sms_getinbox(NULL),
     sms_getcredits(NULL),
     sms_initialize_defaults(NULL),
     text_("smstxt32.dll")
    {
            this -> Init(this -> text_.c_str());
    }
    
    SMSText::SMSTextImpl::
    ~SMSTextImpl()
    {
            try
            {
                    this -> Cleanup();
            }
            catch(...)
            {
                    // do nothing
            }
    }
    .
    .
    .
    

    wie volkhard es schon gesagt hat.



  • Danke euch beiden 👍 Wenn ich sehe wie schnell ihr geantwortet habt und wie lange ich danach gekaut habe komme ich mir ziemlich dumm vor 😞 Nochmals danke.


Anmelden zum Antworten