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_elementsp_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的详细解析]

使用static_cast进行父类指针转子类指针可能出现的问题

dynamic_cast用法

C++中的虚函数(类的向上转换,和向下转换)

成员指针的大小和 reinterpret_cast 是不是固定?