Странная проблема инициализации вектора - PullRequest
0 голосов
/ 19 февраля 2010

Я недавно отладил странную проблему C ++, в которой недавно объявленный вектор как-то имел размер 477218589. Вот контекст:

struct Triangle {
    Point3 a,b,c;
    Triangle(Point3 x, Point3 y, Point3 z) : a(x), b(y), c(z) {}
    Vector3 flat_normal() { return (a-c)^(b-c); }
};

vector<Triangle> triangles;

Вызов triangles.size() возвращает значение 477218589. Я «исправил» проблему, изменив struct Triangle на class Triangle, но мне интересно, почему есть какая-то разница. Должен ли я сделать это typedef struct Foo { ... } Foo; волшебство? Если да, то почему это поможет?

Если это имеет значение, я использую g ++ - 4.1.

Ответы [ 2 ]

1 голос
/ 19 февраля 2010

Это

#include <vector>
#include <iostream>

struct Point3 {};

struct Triangle {
    Point3 a,b,c;
    Triangle(Point3 x, Point3 y, Point3 z) : a(x), b(y), c(z) {}
};

int main()
{
    std::vector<Triangle> triangles;

    std::cout << triangles.size() << '\n';

    return 0;
}

печатает 0 для меня. Если это также относится к вам, то проблема заключается в частях кода, не включенных в этот фрагмент. Если он печатает что-то еще, что-то не так с вашим компилятором / std lib / setup.

1 голос
/ 19 февраля 2010

Не должно быть никакой разницы между объявлением Triangle как структурой или классом - в C ++ различие между ними состоит в том, что спецификация доступа по умолчанию для членов является публичной для struct и private для класса, но это все .

Есть ли что-то еще для Triangle, что вы не включили?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...