2017-01-26 4 views
-1

Die Groß() Funktion ein Teil meiner Klasse ist:Funktion nimmt nicht 0 Argumente

class MyString { 
public: 
    MyString(); 
    MyString(char cstring[]); 
    void uppercase(); 

private 

}; 

Und die Umsetzung für Groß nicht beendet ist, sondern sieht wie folgt aus:

void MyString::uppercase() 
{ 
    cout << "need to implement"; 
} 

Als ich rufen sie die Funktion, sieht es wie folgt aus:

//Output streaming Operator Overload 
ostream& operator<<(ostream& os, const MyString& string) 
{ 
    if (MyString::printAsUppercase == true) 
     uppercase(); 
    else 
     os << string.data; 

    cout << "(" << string.length << ")"; 
    return os; 

} 

Wenn ich versuche, den Code zu kompilieren, erhalte ich folgende Fehlermeldung:

Ich verstehe das wirklich nicht, wie ich den Prototyp erklärte, um keine Argumente zu nehmen, und folgte damit in der Implementierung. Die Funktion sollte keine Argumente annehmen müssen. Warum passiert das?

+5

Und das ist, warum Sie [nicht verwenden 'using namespace std;'] (http://stackoverflow.com/questions/1452721/why- is-using-namespace-std-added-bad-practice) – NathanOliver

+1

Beachten Sie den Unterschied zwischen Ihrem 'MyString :: Großbuchstaben' und der Compileranfrage nach' std :: Großbuchstaben'. Der schlechte Compiler ist verwirrt und ruft die falsche Funktion auf. – user4581301

+0

Sie haben da ein paar Probleme auf der Hand: 1) 'using namespace std;' 2) Benennung des Arguments "string" (wie der std type - gebunden um Probleme zu verursachen) 3) benennt Ihre Funktion identisch mit dem 'std :: Großbuchstaben. –

Antwort

0

Sie müssen angeben, dass Sie Ihre Großbuchstabenmethode aufrufen möchten. Der Fehler besagt, dass Sie "Std :: Großbuchstaben" < < Std aufrufen :: Sie müssen Ihre Methode auf Ihre Klasse aufrufen.

Kommentar bearbeiten: François Andrieux erwähnt, dass dies wahrscheinlich ein Problem ist, weil Sie "using namespace std;" Daher werden alle Funktionsaufrufe in der Std gesucht. (Und hes Recht damit :))

+0

Vielleicht würde diese Antwort verbessert, wenn es auch erwähnt, dass dieses Problem wahrscheinlich ein Symptom für 'using namespace std; ist. –

+0

Wenn ich" MyString :: largecase() "angeben, erhalte ich den folgenden Fehler: Eine nicht statische Mitgliedsreferenz muss relativ sein zu einem bestimmten Objekt. Und ich kann es nicht als "String" angeben.Großbuchstaben() "weil der String-Typ ist const und kann nicht geändert werden, was die Großbuchstaben() Funktion scheint mit der Zeichenfolge zu tun. – Dima

+0

@Dima natürlich tun Sie, denn was Sie wollen, ist nicht eine statische nennen MyString :: large(), aber string.uppercase(). Sie müssen etwas mehr in Ihren C++ - Büchern lesen, um mehr über Namespaces, statische Member-Funktionen, Bereiche, reservierte Namen/Namenskonflikte und C++ im Allgemeinen zu erfahren.) –

1

std::uppercase ist ein legitimes E/A-Stream-Objekt in der Standardbibliothek. Da Sie im std-Namespace codieren, kann der Compiler nicht feststellen, ob Sie Ihre Funktion oder das Bibliotheksobjekt verwenden. Eine einfache Lösung ist, ändern Sie den Namen Ihrer Funktion oder geben Sie Ihre Klasse MyClass :: Großbuchstaben (...). Eine bessere Lösung wäre es, den Code in Ihren eigenen Namespace einzubinden oder die Kodierung im std-Namespace mit der Deklaration "using namespace std" zu vermeiden. Meiner Meinung nach ist es klarer, den std-Namespace bei jeder Verwendung anzugeben. Zum Beispiel, anstatt "using namespace std;" „Cout < < ...“ schreiben Sie einfach „std :: cout < < ...“ dann

+0

Got thanks thanks ! Ich habe angegeben, dass ich meine Klasse verwende, aber sie möchte einen bestimmten Verweis auf ein Objekt haben. Also habe ich das Objekt angegeben, aber es ist nicht mit dem Objekttyp kompatibel, weil ich im Funktionsprototyp "const" angegeben habe, da dies das ist Standard-Streaming-Operator-Überladesyntax. Ist es in Ordnung, "const" zu entfernen? – Dima

+0

@Dima Es wird als schlechte Übung angesehen, ein Objekt zu ändern/mutieren, das an einen Stream-Operator übergeben wird. Der Hauptgrund dafür ist, dass es bei nachfolgenden Funktionsaufrufen nicht zu den gleichen Ergebnissen führen würde. Sie können Ihrer Klasse eine weitere Methode hinzufügen, um eine Großschreibung zurückzugeben, ohne das Original zu ändern, oder eine Funktion verwenden, um eine Kopie der abgerufenen Zeichenfolge zu ändern. – callyalater

0

ich den folgenden Code hoffen helfen könnte, die Punkte zu verstehen, die von anderen Benutzern angezeigt. Es kompiliert, aber ... es auf jeden Fall bei weitem nicht optimal ist:

main.cpp 

#include <iostream> 
#include "MyString.h" 

int main(int argc, char** argv) 
{ 
    // Needs arguments from command line!!! 
    MyString teststring(argv[1]); 
    std::cout << teststring << std::endl; 
    return 0; 
} 

MyString.h 

class MyString { 
public: 
    MyString(); 
    MyString(char *cText); 
    void myUpperCase(); 
    int myStringLenght(); 

protected: 
    bool printAsUppercase; 
    char *data; 
    friend std::ostream& operator<<(std::ostream& os, 
            MyString mystring); 
}; 

MyString.cpp 

#include <cstdlib> 
#include <cstring> 
#include <iostream> 
#include "MyString.h" 

MyString::MyString(char *cText) 
{ 
    data = (char *)std::malloc(strlen(cText)); 
    std::strcpy(data, cText); 
} 

void MyString::myUpperCase() 
{ 
    std::cout << "not yet implemented"; 
} 

int MyString::myStringLenght() 
{ 
    return int(strlen(data)); 
} 

std::ostream& operator<<(std::ostream& os, 
          MyString mystring) 
{ 
    // to be deleted - only for testing 
    mystring.printAsUppercase = true; 

    if (mystring.printAsUppercase == true) 
     mystring.myUpperCase(); 
    else 
     os << mystring.data; 

    std::cout << "(" << mystring.myStringLenght() << ")"; 
    return os; 
} 
Verwandte Themen