奇怪的向量初始化问题 我最近调试了一个奇怪的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; struct三角形{ 第3点a、b、c; 三角形(点3x,点3y,点3z):a(x),b(y),c(z){} 向量3平坦_正规(){返回(a-c)^(b-c);} }; 矢量三角形;
调用奇怪的向量初始化问题 我最近调试了一个奇怪的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; struct三角形{ 第3点a、b、c; 三角形(点3x,点3y,点3z):a(x),b(y),c(z){} 向量3平坦_正规(){返回(a-c)^(b-c);} }; 矢量三角形;,c++,vector,struct,C++,Vector,Struct,调用triangles.size()返回值477218589。 我通过将struct Triangle更改为class Triangle来“修复”这个问题,但我想知道为什么会有任何不同。我是否应该这样做typedef struct Foo{…}Foo魔法?如果是这样,为什么会有帮助 如果我有问题,我使用G++—4.1。< /P> < P>在C++中,将三角形< /> >作为结构或类——不应该有任何区别,两者之间的区别是成员的默认访问规范对于结构和私有类是公开的,但就是这样。 关于三角形,还有什么
triangles.size()
返回值477218589
。
我通过将struct Triangle
更改为class Triangle
来“修复”这个问题,但我想知道为什么会有任何不同。我是否应该这样做typedef struct Foo{…}Foo代码>魔法?如果是这样,为什么会有帮助
如果我有问题,我使用G++—4.1。< /P> < P>在C++中,将<代码>三角形< /> >作为结构或类——不应该有任何区别,两者之间的区别是成员的默认访问规范对于结构和私有类是公开的,但就是这样。
关于三角形,还有什么你没有包括的吗?
#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;
}
#包括
#包括
结构点3{};
结构三角形{
第3点a、b、c;
三角形(点3x,点3y,点3z):a(x),b(y),c(z){}
};
int main()
{
向量三角形;
std::cout我也不认为有什么区别!我已经添加了三角形点3
和向量3
的全部内容都是简单的类。好吧,这里有一个补充:除非它提供了默认构造函数,否则不能使用带有std::vector
的类型。(我的编译器没有检测到这一点,因为代码段从未尝试填充向量。)由于Triangle
不提供默认构造函数,从技术上讲,它可能会调用未定义的行为。只有在调用方法并希望使用默认值时,才需要默认构造函数。vec.resize(10)
-需要默认构造函数,否则它将无法编译,vec.resize(10,Something(x,y));
-不需要默认构造函数。@UncleBens:谢谢您的澄清!您所描述的可以安全地称为“不太可能”原因不止一个。显然,您没有发布整个代码。而且,将struct
更改为class
除了会导致重新编译翻译单元外,不会解决问题(如果有)。如果要在调试过程中可靠地监视变量,则必须关闭优化。如果是程序本身输出了错误的值,请发布一个显示该行为的最小可编译代码段。嗯,我无法在其他地方重现该错误,因此显然它不存在!:-P无论如何,谢谢。