Poll: Ben ik klaar voor mijn examen?

Ga naar pollev.com/woutergroene532 om mee te doen. De mogelijke antwoorden zijn voor elke snippet hetzelfde:

  1. Compileert NIET. (Fouten bij gcc commando)
  2. Compileert, maar runtime ERROR. (Fouten bij uitvoeren: segfaults e.d.)
  3. Runt, maar ONGEWENST gedrag. (Geen fouten maar bugs in gedrag)
  4. WERKT zoals verwacht.

Includes en namespaces worden buiten beschouwing gelaten.

Klik op de snippet headers om de snippet te tonen.

Snippet 1

class Student;

class Teacher {
private:
    std::vector<Student*> students;
public:
    Teacher() {
        students.push_back(new Student());
    }
};

Antwoord: Compile fout; forward definition van Student klasse kan, maar new() niet.

Snippet 2

class Student;

class Teacher {
private:
    std::vector<Student*> students;
public:
    Teacher() {
        students.push_back(NULL);
    }
};

Antwoord: Werkt. NULL toevoegen werkt omdat het een pointer naar ‘niets’ is.

Snippet 3

void maths(int* x) {
    x++;
}
int main() {
    int one = 0;
    maths(&one);
    return one == 1;
}

Antwoord: Onverwacht gedrag. x++ verhoogt het adres van de pointer, niet de eigenlijke waarde: we moeten hier nog dereferencen.

Snippet 4

void swap(int* x, int* y) {
    int z = *x;
    *x = *y;
    *y = z;
}
int main() {
    int two = 1, one = 2;
    swap(&one, &two);
}

Antwoord: Werkt. Tekstboek voorbeeld van waardes swappen.

Snippet 5

class X {
public:
    int i;
    X(int i) : i(i) {}
};

bool setToOne(const X& x) {
    x.i = 1;
    return x.i == 1;
}
int main() {
    X x(2);
    std::cout << setToOne(x);
}

Antwoord: Compile fout. const betekent dat de waarde van x niet kan wijzigen, dus x.i = 1 geeft een fout.

Snippet 6

struct dinges {
    void* x;
    void* y;
};
int main() {
    int *a;
    dinges iets = { (void*) a, (void*) a };
    delete a;
    std::cout << iets.x;
}    

Antwoord: Runtime error. Na de delete de pointer ‘volgen’ geeft (onverwachte) problemen.

Snippet 7

template<typename T> class Punt {
  private:
   T x, y;
  public:
   Punt(T theX, T theY) : x(theX), y(theY) {}
};
int main() {
    Punt<double> pt(1.2, 3.4);
    Punt<int> pt2(3, 5);
}    

Antwoord: Werkt. Een voorbeeld template klasse.

Snippet 8

// in punt.h
template<typename T> class Punt {
private:
    T x, y;
public:
  Punt(T theX, T theY);
  T getX() { return x; };
};

// in punt.cpp
Punt<T>::Punt(T theX, T theY) : x(theX), y(theY) {
}
int main() {
    Punt<int> x(1, 2);
    std::cout << x.getX();
}

Antwoord: Compile fout. T herhalen in punt.cpp vereist opnieuw de definitie van de template: template<typename T>.

Snippet 9

int main() {
    int hoeveel = 0;
    scanf("%d", hoeveel);
    printf("echt zoveel? %d\n", hoeveel);
}

Antwoord: Runtime error. scanf() verwacht een correct adres, niet de waarde 0, dat buiten het bereik van het programma valt.

Snippet 10

class Inception {};
int main() {
    vector<Inception**> *v;
    Inception *x = new Inception();
    v = new vector<Inception**>();

    Inception** y = new Inception*[10];
    y[1] = x;
    v->push_back(y);
}

Antwoord: Werkt. Dubbele pointers zijn Arrays van pointers. Vectoren van dubbele pointers zijn tweedimensionele arrays.