Char und gethostbyname()

  • Themenstarter Themenstarter spex
  • Beginndatum Beginndatum
S

spex

Hi

ich habe eine Klasse geschrieben mit deren Hilfe ich E-Mails verschicken kann.
Nun gefällt es mir aber ganz und garnicht das ich überall die C++Strings verwende (<string>).

Ich hab mich jedoch noch nie wirklich mit den C-Strings bzw Chars beschäftigt.
Nun will ich komplett auf C++Strings verzichten und nurnoch C-Strings verwenden.

Meine Klasse ist folgendermassen aufgebaut:
PHP:
class sMail
{
    // .......
    public:
    char* Server;
    // .......
};
Die Variable "Server" soll er jetzt in "gethostbyname()" verwenden, etwa so:
PHP:
host = gethostbyname(Server);
Damit man später die Variable Server einfach folgendermassen setzen kann:
PHP:
sMail mail;
mail.Server = "mail.gmx.net";

Mein Problem ist das ja "gethostbyname" einen "const char*" erwartet und nun rummeckert ohne Ende.

Vorallem aber erwarten ja allemöglichen Funktionen einen "const char*",
ich will nun endlich mal versuchen mit C-Chars zu arbeiten und nicht immer ein "ieinstring.c_str()" hinklatschen zu müssen. Das ist unschön.

Wie muss es richtig aussehen damit es funktioniert?

Danke schonmal für eure Antworten.
Gruß
 
Vorallem aber erwarten ja allemöglichen Funktionen einen "const char*",
ich will nun endlich mal versuchen mit C-Chars zu arbeiten und nicht immer ein "ieinstring.c_str()" hinklatschen zu müssen. Das ist unschön.

Ich finde da aber C++-Strings schöner und dann bei bedarf halt.c_str().

Ich kenn mich zwar auch net gut mit C++ aus aber sowas funktioniert bei mir ohne Probleme.
C++:
#include <iostream>

void test(const char* bar) {
    std::cout << bar << "\n";
}

int main(int argc, char** argv) {
    char* foo;
    foo = "Hello World";

    test(foo);

    return 0;
}
 
Zuletzt bearbeitet von einem Moderator:
Diese Funktion also "c_str()" möchte ich nicht benutzen weil diese bei mir nach dem ersten Aufruf geschlagene 44,5KByte in anspruch nimmt. D.h die Anwendung ist am Ende 45Kbyte größer.

Muss doch eine ganz verständliche Lösung geben.
 
Hi,
C-strings sind eigentlich nur char-Arrays, mehr nicht, die funktionen um damit zu arbeiten, sind dann sprintf(), strstr(), strchr(), strrchr(), und das alles in verbindung mit char-Zeigern, aber glaub mir, mit C++ Strings bist du definitiv besser bedient.
 
Also vom Klassendesign kannste das innne Tonne kloppen. Du gibst zu viel Zugriff auf interna!

C++:
class sMail
{
    char* m_server;
    // ...

public:
    explicit sMail(const char* const server)
        : m_server(new char[std::strlen(server) + 1]) /*, ... */
    {    
        std::strcpy(m_server, server); 
        // ...
    }

    sMail(sMail const& mail)
        : m_server(new char[std::strlen(mail.m_server) + 1])/*, ... */
    {
        std::strcpy(m_server, mail.m_server);
        // ...
    }

    sMail& operator=(sMail const& mail)
    {
         if (&mail == this) return *this;
    
         delete [] m_server;
         m_server = new char[std::strlen(mail.m_server) + 1];
         std::strcpy(m_server, mail.m_server);
         // ...
     }

    ~sMail()
    {
        delete [] m_server;
        // ...
    }
};
... dann klappt es auch ;)
 
Hör nicht auf die anderen :( ...
wenn du C-Strings verwenden möchtest, warum nicht?
Ich versteh nur dein Problem nicht ganz
Du willst einen "C-string" als " const char * " übergeben, und wo liegt das Problem
Bis auf das const ist es doch genau das gleiche, und das const schafft der Compiler auch noch im Alleingang, ohne das du was ändern musst

Gruß
 
Hör nicht auf die anderen :( ...
Was solln so ne Aussage? Er sollte nicht auf deinen Mist hören, den du von dir gibst, das wohl eher, ja.

Zu beachten ist bei puren Zeigern (keine smart-pointer), dass du Copy-Constructur und Assignment-Operator selbst schreiben musst, und auch das löschen nicht vergessen darfst.

Des weiteren gibt man dem Benutzer der Klasse NIEMALS direkten Zugriff auf den Zeiger! Dann verliert man die Kontrolle darüber, was er damit anstellt. Einen Setter u. Getter wären hier angebracht, wenn du nicht per Konstruktor die angaben machen willst.
 
Zurück