C - cast 问题中的指针和继承?
Posted
技术标签:
【中文标题】C - cast 问题中的指针和继承?【英文标题】:Pointer and inheritance in C - cast issue? 【发布时间】:2012-10-09 16:04:47 【问题描述】:我正在做一个 opengl 项目,但我的一些课程有问题:
主要有3个类:
class scene
public:
scene();
object** elements;
unsigned int nb_elements;
void add_object(object* _element)
objet** p_elements=elements;
while(p_elements-elements!=nb_elements)
p_elements++;
*p_elements=_element; //here is the bug
nb_elements++;
[...]
;
class object
public:
object();
[...]
;
class point : public object
point();
point(double _x, double _y, double _z,double _r);
[...]
我在初始化Opengl后初始化场景,在同一个函数中:
void GLWidget::initializeGL()
[OpenGL initialization]
_scene=new scene;
point* s1=new point(0.0,0.0,3.0,1.0);
_scene->add_object(s1);
bug 是在 scene::add_object 函数中。我不明白为什么它不起作用,因为 *p_elements 和 _element 都是指针。我猜这是演员阵容问题,但我不知道如何解决。我尝试了动态转换:错误仍然存在。
感谢您的帮助,
卡茅斯
【问题讨论】:
为什么这被标记为C? C 和 C++ 是两种完全不同的语言 你为elements
分配内存了吗?
@RichardJ.RossIII 正是如此。我认为 C 指的是您可以在 add_object
中看到的代码(通常是 nb_elements
)。这不是典型的 C 代码。你可以看到一个类关键字这一事实并不能让它成为我的“C++”
不,我没有……我很丢脸……谢谢!
【参考方案1】:
objet** p_elements=elements;
将p_elements
设置为未初始化的内存。所以p_elements-elements!=nb_elements
、p_elements++;
和*p_elements=_element;
调用未定义的行为。我不建议您初始化内存,而只是使用std::vector
和智能指针。
双指针建议你来自 C 背景,但如果你想做 C++ 开发,你必须学习 C++ 习语。不要拘泥于用 C++ 编写 C 代码。
【讨论】:
嗨,我使用了双指针,因为我使用了一个需要通过指针调用的虚函数(我说的对吗?)。 如果elements
已在构造函数中分配,则肯定不会。这是一个错误,因为当循环完成时p_elements
将指向elements
数组的末尾,假设nb_elements
设置正确。
实际上,考虑到最后的nb_elements
,它更像是一个“你没有分配足够的内存”的错误。不过,要回显@LuchianGrigorie,请尝试改用std::vector
。
@Kamouth 没有。您也可以通过智能指针和引用调用虚函数。
@Luchian Grigore,好的,但我不能使用 std::vector 对吗?我不知道什么是智能指针。以上是关于C - cast 问题中的指针和继承?的主要内容,如果未能解决你的问题,请参考以下文章
[C/C++]_[中级]_[static_cast的详细解析]
[C/C++]_[中级]_[static_cast的详细解析]