Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Atelier Quiz] Question pour un champion (C++)

Atelier du forum C++

Anonyme
31 août 2013 à 22:03:37

moi62100 a écrit:

Ça créé une classe anonyme vide dérivée de pif et paf ?:euh:


Presque mais pas tout à fait.
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
31 août 2013 à 22:12:14

Une classe anonyme vide qui contient pif et paf ?
  • Partager sur Facebook
  • Partager sur Twitter
31 août 2013 à 22:15:44

Une class anonyme qui contient pif et paf comme methode ?
  • Partager sur Facebook
  • Partager sur Twitter

Je suis juste un débutant expérimenté. RTFM | RTFD

Anonyme
31 août 2013 à 22:16:44

Mohack a écrit:

Une class anonyme qui contient pif et paf comme methode ?


L'aspect anonyme est dans la réponse, mais tu es plus froid que moi62100 pour le coup.

-
Edité par Anonyme 31 août 2013 à 22:17:45

  • Partager sur Facebook
  • Partager sur Twitter
31 août 2013 à 22:23:33

Un objet paf d'un type non nommé dérivant (de manière privé) de pif. Je laisse.
  • Partager sur Facebook
  • Partager sur Twitter
FaQ : Fr | En 1 2 | C++11 | Template || Blog : Deloget | C++|Boost--Dev | C++Next | GotW || Installer Boost
31 août 2013 à 22:25:08

Ceci est dans le C++11 ?(franchement du jamais vu) Bon les mecs je vais au lit car j'ai sommeil 

@+

  • Partager sur Facebook
  • Partager sur Twitter

Je suis juste un débutant expérimenté. RTFM | RTFD

Anonyme
31 août 2013 à 22:30:17

Freedom a écrit:

Un objet paf d'un type non nommé dérivant (de manière privé) de pif. Je laisse.


tout simplement, avec les 2 dernieres accolades représentant une "initializer list" vide, pour utiliser la nouvelle syntaxe uniformisé de construction des objets.
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
31 août 2013 à 22:38:28

Ah ok comme quoi il y a toujours des trucs à apprendre.^^

Je prend la main: est-ce que ce code est correct:

#include <fstream>
#include <iostream>
#include <string>

int main()
{
    std::string path("file.ext");
    std::ifstream input(path);
    if(input)
    {
        unsigned life;
        input >> life;
        life -= 5;
        std::cout << life << std::endl;
    }
    return 0;
}

?

  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
31 août 2013 à 22:46:52

C'est techniquement valide, mais rien ne garanti lorsque file.ext est bien ouvert que la lecture d'un nombre non signé va réussir, il faudrait tester input.fail(), ensuite rien ne garanti que l'on a pas lu un nombre entre 0 et 4, on aurait alors non pas [-5..0] afficher mais [2^32-4..2^32-1] et 0 en retour
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
31 août 2013 à 22:53:07

Bien joué. Il faut ajouter qu'il faut compiler en C++11 pour que le constructeur de input soit valide (avec une std::string), c'est surtout ça que j'attendait.;)

Personnelement je verifierait plutot que le life à bien été lu avec input.good(), ça me semble plus logique.^^

-
Edité par Anonyme 31 août 2013 à 22:54:18

  • Partager sur Facebook
  • Partager sur Twitter
31 août 2013 à 22:54:03

Je pense que galop1n veut dire oui, mais sans plus quoi x)
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
31 août 2013 à 22:56:13

Oui, justement la ce n'est pas le oui / non qui compte, mais la justification, et j'avais bien compris ce qu'il voulait dire.^^

-
Edité par Anonyme 31 août 2013 à 22:59:07

  • Partager sur Facebook
  • Partager sur Twitter
1 septembre 2013 à 0:02:18

moi62100 a écrit:

std::ifstream et std::ofstream, tout les deux dérivés de std::fstream (tout les trois dans <fstream>).

En fait, il n'y a pas d'héritage entres ces 3 classes.

fstream hérite de ostream et istream
ifstream hérite de istream
ofstream hérite de ostream.
fstream
ofstream


Comme il n'y a plus de question j'en met une pour les insomniaques.
Une un peu tordus pour donner une excuse au couche tard :o)

Que retourne ce code et pourquoi ?

#include <functional>

struct A { int i; };

int main() {
  A a{2};
  std::function<const A&()> f = [&a](){ return a; };
  A b = f();
  return b.i;
}
Attention, il y a un piège.
Pour le voir, je conseille de le compiler en release (-O2 ou -O3 pour gcc) sinon le 'piège' risque de ne pas apparaître.

-
Edité par jo_link_noir 1 septembre 2013 à 0:09:47

  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
1 septembre 2013 à 0:48:19

Je ne voit pas ton piege donc je vais surement tomber dedant, mais ce code retourne 2, car on appelle une lambda qui retourne une référence constante vers a dont la valeur de retour est assignée à b.

  • Partager sur Facebook
  • Partager sur Twitter
1 septembre 2013 à 0:48:29

Ahah, j'ai beau me débrouiller en C/C++, j'comprends rien à ton code xD
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
1 septembre 2013 à 0:57:15

Thall206 a écrit:

Ahah, j'ai beau me débrouiller en C/C++, j'comprends rien à ton code xD

C'est peut être parce que std::function existe depuis le C++11 (les lambda aussi je croit).;)
  • Partager sur Facebook
  • Partager sur Twitter
1 septembre 2013 à 1:17:54

@moi62100: Officiellement std::function est en effet du C++11, cependant l'idée de std::function ca fait 10 ans qu'elle existe (boost::function, loki et std::function en C++0x assez tôt). Les lambda comme core langage, oui c'est plus nouveau.

NB: Je ne répond pas à la question pour laisser chercher (question déjà posé sur un autre forum).

  • Partager sur Facebook
  • Partager sur Twitter
FaQ : Fr | En 1 2 | C++11 | Template || Blog : Deloget | C++|Boost--Dev | C++Next | GotW || Installer Boost
Anonyme
1 septembre 2013 à 1:18:23

C'est Undefined Behavior je dirais, la lambda déduit son retour en automatique, elle renvoit donc par copie, sauf que l'objet function s'attend à un objet pouvant renvoyer une référence.

Du coup, debug ou release importe peu, tout peu arriver ! en précisant "-> A const &" a la declaration de la lambda, ça devrait réglé le probleme

EDIT : Mais merci à Freedom pour avoir préciser que c'était une question vu sur le grand internet, du coup j'ai cherché, car si la source du bug me semblait evident, les trefonds du pourquoi ne m'était pas bien clair :)

-
Edité par Anonyme 1 septembre 2013 à 1:25:18

  • Partager sur Facebook
  • Partager sur Twitter
1 septembre 2013 à 3:44:45

Avec un Undefined Behavior, release ou debug peu jouer, les instructions peuvent être différentes et réorganisées. Sans les optis ça retourne 2, avec les optis ça me retourne 96 (g++-4.8). Mais c'est vrai que ça varie selon les compilos et la version.

Sinon oui, c'est tout à fait ça. Si le type de retour n'est pas indiquer la lambda utilise decltype sur la valeur de retour (`decltype(a)`) et vire les référence s'il y en a. Comme `a` est de type A, le retour est un type A.
Dû coup, std::function manipule une temporaire (là encore ça passe) mais retourne une référence sur cette variable temporaire. Comme c'est une temporaire elle est détruite à la fin de std::function::operator()() (ou avant selon l'implémentation) et le dans le main `b` référence une variable qui n'existe plus.

* Une temporaire ici est une variable de type `const T &`initialisée par le retour d'une fonction retournant un  type `T`. Cette temporaire est détruite à la fin du scope.

Pour le moment je n'ai pas de question marrante (ou tordus selon le point de vue) alors je sors un classique.

Ce code ne compile pas ou donne un résultat inattendu. Pourquoi `NULL` n'est pas adapter ? Par quoi faut-il remplacer la macro ?

#include <iostream>

void f(int)
{ std::cout << "f(int)" << std::endl; }

void f(std::streambuf*)
{ std::cout << "f(std::streambuf*)" << std::endl; }

int main()
{
  f(NULL);
}
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
1 septembre 2013 à 8:56:23

NULL est pas adapté car il est souvent défini en tant que zero, zero qui a la particularité de pouvoir se transformer en pointeur, du coup, c'est la première fonction qui est priviligié.

Remarque, sur ps3, NULL était defini comme ca : "((char*)0)", pas classe :(

Remarque 2 : c++11 ajoute nullptr qui est d'un type std::nullptr_t. Ce type est à la discretion du compilateur néanmoins, mais cette manière de faire permet d'ajouter une surcharge à une fonction qui prend un pointeur pour spécialisé le code si l'appel se fait avec nullptr.

  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
1 septembre 2013 à 12:24:15

Allez, une petite pendant que je vais me faire Planes en avant première ( mon dieu, ils ont osé Cars avec des avions *_* )

Quels sont les valeurs possibles affiché pour cette bien laide variable globale et pourquoi ?

#include <iostream>

size_t globalsAreEvils {};

struct Pif {
  Pif() { globalsAreEvils++; }
  Pif( Pif const & ) { globalsAreEvils++; }
  Pif& operator=( Pif const & ) { globalsAreEvils++; return *this; }
};

Pif Paf() {
    return Pif{};
}

int main()
{
    auto pif = Paf();
    std::cout << globalsAreEvils <<std::endl;
}

Indice : il n'y a ni comportement indéfini ni  d'erreur dans ce code et pourtant...

-
Edité par Anonyme 1 septembre 2013 à 12:28:11

  • Partager sur Facebook
  • Partager sur Twitter
1 septembre 2013 à 17:07:32

J'ai vu l'affiche de plane ce matin en allant voir kick-ass 2, je me suis fait la même réflexion.

globalsAreEvils = 1. Seul le constructeur par défaut est utiliser. Paf ne fait pas de copie pour le retour grâce à la RVO et comme le égal initialise pif, c'est le constructeur qui est appeler et donc pas de copie grâce à la RVO.

Comment redirigez le flux std::cout dans un fichier ?

  • Partager sur Facebook
  • Partager sur Twitter
1 septembre 2013 à 17:26:37

Pourtant chez moi ca mais

1 warning :  extended initializer lists only available with -std=c++11 or -std=gnu++11 [enabled by default]

1 error :  expected unqualified-id before '=' token|

:(

  • Partager sur Facebook
  • Partager sur Twitter

Je suis juste un débutant expérimenté. RTFM | RTFD

1 septembre 2013 à 17:27:04

j'ai fait un double ! Desole mais le compilateur me rend ca !

-
Edité par Mohack 1 septembre 2013 à 17:29:03

  • Partager sur Facebook
  • Partager sur Twitter

Je suis juste un débutant expérimenté. RTFM | RTFD

1 septembre 2013 à 17:27:08

@jo_link_noir: T'es sur la bonne piste avec les ellisions, sauf que tu oublies que le compilateur n'a pas l'obligation de les faire (d'où le pluriel dans la question de galop1n).

@Mohack: Tu as du désactivé le C++11.

-
Edité par Freedom 1 septembre 2013 à 17:29:38

  • Partager sur Facebook
  • Partager sur Twitter
FaQ : Fr | En 1 2 | C++11 | Template || Blog : Deloget | C++|Boost--Dev | C++Next | GotW || Installer Boost
1 septembre 2013 à 17:45:07

Freedom desole mais Code::Blocks est comme il etait depuis que je l'ai installer (en 2012) donc rien touché (enfin... ne me dit pas qu'il n'est pas a jour car ce la derniere version stable avec MinGW 4.7 )
  • Partager sur Facebook
  • Partager sur Twitter

Je suis juste un débutant expérimenté. RTFM | RTFD

1 septembre 2013 à 18:10:48

@Freedom: Je me demande quel compilateur ne le fait pas ? Mais c'est vrai que si l'optimisation n'est pas activer le résultat est 3.

@Mohack: Il faut regarder dans les options de compilation. Il y a une case à cocher ou sinon mettre -std=c++11 dans la liste des options/flags.

  • Partager sur Facebook
  • Partager sur Twitter
1 septembre 2013 à 18:33:50

Utiliser cout.rdbuf(monfichier.rdbuf());
  • Partager sur Facebook
  • Partager sur Twitter
1 septembre 2013 à 19:26:28

Voila ma question :

Énoncé :

#include <iostream>

class A {
public:
    A() { std::cout << 'a'; }
    ~A() { std::cout << 'A'; }
};

class B
{
public:
    B() { std::cout << 'b'; }
    ~B() { std::cout << 'B'; }
    A a;
};

int main () {
    B b;
}

Que va s'afficher dans la console et pourquoi ? Il faut bien justifier la reponse ;)

-
Edité par Mohack 1 septembre 2013 à 19:30:05

  • Partager sur Facebook
  • Partager sur Twitter

Je suis juste un débutant expérimenté. RTFM | RTFD

1 septembre 2013 à 19:49:49

Euh t'es sur que c'est toi qui as la main ?

sinon : abBA

-
Edité par Cytosol 1 septembre 2013 à 20:27:44

  • Partager sur Facebook
  • Partager sur Twitter