c++11 fragen



  • hallo

    ich lese gerade das buch c++11 von rainer grimm und habe ein paar fragen. meine eigenen kommentare / fragen sind in /* */. die codes sind aus dem buch. meine fragen wurde nicht (eindeutig) im nebenstehenden text beantwortet, daher wende ich mich an's forum.

    #include <iostream>
    #include <string>
    #include <vector>
    
    struct ClassMemberInitializer{
    
    	ClassMemberInitializer(int override):x(override){};
    	/* 1.0. Das Semikolon hier ist keine Pflicht, ja? */
    
    	//valid with C++98
    	const static int oldX=5;
    
    	// valid with C++11
    	int X=5; //class member initializer
    
    	// valid with C++11
    	std::string s="Hello C++11";
    
    	// valid with C++11
    	std::vector<int> myVec{1,2,3,4,5};
    
    };
    
    int main(){
    
    	std::cout << "\n";
    
    	// class member initialization
    	ClassMemberInitializer cMI;
    	/* 1.1. Das dürfte doch nicht gehen weil kein Standardkonstruktor vorhanden ist, ja? */
    
    	std::cout << "cMI.oldX " << cMI.oldX << "\n"; // 0
    	/* 1.2. Wieso sollte hier 0 ausgegeben werden? (siehe Autor-Kommentar) */
    
    	std::cout << "cMI.x " << cMI.x << "\n"; // 5
    	std::cout << "cMI.s " << cMI.s << "\n"; // Hello C++11
    
    	for (auto vecIt= CMi.myVec.begin(), myVec)
    		std::cout << *vecIt << " "; //1 2 3 4 5
    	/* 1.3. Syntax? Im Buch wurde eine Range-For-Syntax mit ':' vorgestellt, die hier mit ',' sagt mir nichts */
    
    	std::cout << "\n";
    	37
    	// class member initialization
    	// x will be overriden by the constructor value
    	ClassMemberInitializer cMI2(10);
    	std::cout << "cMI2.oldX " << cMI2.oldX << "\n"; // 0
    	std::cout << "cMI2.x " << cMI2.x << "\n"; // 10
    	std::cout << "cMI2.s " << cMI2.s << "\n"; // Hello C++11
    	for (auto vecIt= CMi2.myVec.begin(), myVec)
    		std::cout << *vecIt << " "; // 1 2 3 4 5
    
    	std::cout << "\n\n";
    
    }
    
    template<typename ... Args> /* 2.0. Wäre hier auch <typename Args...> erlaubt? */
    int countMe(Args ... args){ /* 2.1. Werden alle Argumente per Value übergeben? */
    	return (sizeof ... args); /* 2.2. Wäre "return sizeof...(args);" auch korrekt? */
    }
    
    template<typename T>
    void printValueInfo(T value){
    
    	// print the information of the value
    	printInfoFor(value);
    
    }
    
    template<typename First, typename ... Rest>
    void printValueInfo(First first, Rest ... rest){
    
    	// print the information of the value
    	printInfoFor(first);
    
    	// invoke value Information for the rest, excluding first
    	printValueInfo(rest...); /* 3.0. Entfernt "..." einen Typen aus dem Parameterpack? */
    	/* 3.1. Könnte man, wenn man zwei Parameter entfernen möchte, auch (rest...)... schreiben? */
    
    }
    

    danke im voraus und gruss


  • Mod

    /* 2.0. Wäre hier auch <typename Args...> erlaubt? */

    Nein.

    /* 2.1. Werden alle Argumente per Value übergeben? */

    Ja. Das sogenannte function parameter pack wird ja auch so deklariert. Wolltest du Const-Referenzen, so würdest du Args const& ... args schreiben.

    /* 1.3. Syntax? Im Buch wurde eine Range-For-Syntax mit ':' vorgestellt, die hier mit ',' sagt mir nichts */

    Ist ja auch falsch. Das mit : ist richtig und standardkonform.

    /* 3.0. Entfernt "..." einen Typen aus dem Parameterpack? */

    Nein, es expandiert alle enthaltenen Entitäten, sodass statt der pack expansion eine durch Kommas getrennte Liste entsteht.

    /* 3.1. Könnte man, wenn man zwei Parameter entfernen möchte, auch (rest...)... schreiben? */

    Nein, solche Konstrukte gibt es nicht (mehrere Ellipsen kommen nur vor, wenn man mehrere Parameter-Packs gleichzeitig expandiert).

    /* 1.0. Das Semikolon hier ist keine Pflicht, ja? */

    Nein, bekanntermaßen muss hinter Funktionen kein Semikolon stehen.



  • Dein Beispiel ist voll von Fehlern. Es kompiliert nicht. Gibt dir etwas mehr Muehe!

    Und was bitte soll:

    for (auto vecIt= CMi.myVec.begin(), myVec)
            std::cout << *vecIt << " "; //1 2 3 4 5
        /* 1.3. Syntax? Im Buch wurde eine Range-For-Syntax mit ':' vorgestellt, die hier mit ',' sagt mir nichts */
    

    Denkst du dir das selbst aus? Ist es ein Makro? Woher hast du das? (Aus dem Buch anscheinend nicht).


  • Mod

    Ist es ein Makro?

    Man kann keine Keywords zu Makros machen.

    A translation unit shall not #define or #undef names lexically identical to keywords, to the identifiers listed in Table 3, or to the attribute-tokens described in 7.6.



  • Arcoth schrieb:

    [...]

    alles klar, vielen dank.

    knivil schrieb:

    Dein Beispiel ist voll von Fehlern. Es kompiliert nicht. Gibt dir etwas mehr Muehe!

    ich habe weder deon code geschrieben noch habe ich ihn abgeändert, er ist 1:1 aus dem buch:
    http://www.addison-wesley.de/media_remote/katalog/bsp/9783827330888bsp.pdf (pdf-seite 20)
    das ist auch der grund wieso ich frage.



  • Mh, das Buch macht mir keinen besonders guten Eindruck... 😉



  • Als erstes suchst Du in einem solchen Fall nach den sog. Errata Deines Buchs. Dort werden Fehler und Berichtigungen veröffentlicht.

    In diesem Fall hier:
    http://www.grimm-jaud.de/index.php/c-11-der-leitfaden-fuer-programmierer-zum-neuen-standard#h6-errata
    Da sind zumindest die gröbsten Schnitzer raus...

    Zwar sind da immer noch Unstimmigkeiten zwischen Kommentaren und Programmausgaben, vielleicht ist der Code auch nicht schön...aber immerhin kompiliert's. 😉


  • Mod

    asfdlol schrieb:

    http://www.addison-wesley.de/media_remote/katalog/bsp/9783827330888bsp.pdf

    Mir ist es Schnurz, aber ist das verlinkte nicht verboten ins Netz gestellt worden? Das werden dann die Mods entfernen.

    das ist auch der grund wieso ich frage.

    Ohne weitere Nachforschungen könnte es sein, dass in einer früheren Version des C++0x-Standards range-based for anders geplant war. Nur so eine Möglichkeit. Wie alt ist das Buch?



  • Arcoth schrieb:

    asfdlol schrieb:

    http://www.addison-wesley.de/media_remote/katalog/bsp/9783827330888bsp.pdf

    Mir ist es Schnurz, aber ist das verlinkte nicht verboten ins Netz gestellt worden? Das werden dann die Mods entfernen.

    Es sind nur 40 Seiten, vielleicht ist es ein Probekapitel. Immerhin keine sibirische Domain, sondern direkt vom Verlag.

    das ist auch der grund wieso ich frage.

    Ohne weitere Nachforschungen könnte es sein, dass in einer früheren Version des C++0x-Standards range-based for anders geplant war. Nur so eine Möglichkeit. Wie alt ist das Buch?

    Wenn es C++-11 heißt, wird es wohl kaum frühe C++0x-Sachen enthalten. Meines Wissens ist das eines der ersten deutschsprachigen C++-11-Bücher gewesen, also irgendwann 2011/12 rausgekommen.


  • Mod

    Bashar schrieb:

    ..

    Achso, danke für die Klarstellungen 👍



  • Furble Wurble schrieb:

    Als erstes suchst Du in einem solchen Fall nach den sog. Errata Deines Buchs. Dort werden Fehler und Berichtigungen veröffentlicht.

    In diesem Fall hier:
    http://www.grimm-jaud.de/index.php/c-11-der-leitfaden-fuer-programmierer-zum-neuen-standard#h6-errata
    Da sind zumindest die gröbsten Schnitzer raus...

    Zwar sind da immer noch Unstimmigkeiten zwischen Kommentaren und Programmausgaben, vielleicht ist der Code auch nicht schön...aber immerhin kompiliert's. 😉

    achso, dass die verlage und autoren so etwas nach der veröffentlichung aufrecht erhalten war mir nicht bekannt, danke.

    Bashar schrieb:

    das ist auch der grund wieso ich frage.

    Ohne weitere Nachforschungen könnte es sein, dass in einer früheren Version des C++0x-Standards range-based for anders geplant war. Nur so eine Möglichkeit. Wie alt ist das Buch?

    Wenn es C++-11 heißt, wird es wohl kaum frühe C++0x-Sachen enthalten. Meines Wissens ist das eines der ersten deutschsprachigen C++-11-Bücher gewesen, also irgendwann 2011/12 rausgekommen.

    gut geschätzt, laut amazon ist das buch am 1. April 2012 erschienen.

    "1.2. Wieso sollte hier 0 ausgegeben werden? (siehe Autor-Kommentar)"
    und
    "2.2. Wäre "return sizeof...(args);" auch korrekt?"
    wären noch ungeklärt. das / die errata hat hier auch nicht aufgeklärt. nur für den fall dass sich noch jemand die zeit nehmen möchte...

    grüsse


  • Mod

    1.2 muss nat. 5 als Ergebnis haben

    2.2 es muss return sizeof...(args); heißen. sizeof... verlangt immer Klammern um das Argument.


Anmelden zum Antworten