Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 指针容器问题_C++_Templates_Pointers_Stl_Exc Bad Access - Fatal编程技术网

C++ 指针容器问题

C++ 指针容器问题,c++,templates,pointers,stl,exc-bad-access,C++,Templates,Pointers,Stl,Exc Bad Access,我有A、B、C、D等类别,以及以下层次结构: class A { B* b; }; class B { C<D>* c; }; template <class T> class C<T> { list<T*> ds; }; class D { }; A类{ B*B; }; B类{ C*C; }; 模板 C类{ 列表ds; }; D类{ }; 我首先使用newa()将A分配为基类中的A*成员。在A中,我使用new b

我有
A
B
C
D
等类别,以及以下层次结构:

class A {
    B* b;
};

class B {
    C<D>* c;
};

template <class T>
class C<T> {
    list<T*> ds;
};

class D {
};
A类{
B*B;
};
B类{
C*C;
};
模板
C类{
列表ds;
};
D类{
};
我首先使用
newa()
A
分配为基类中的
A*
成员。在
A
中,我使用
new b()分配
b
。在
B
中,我使用
newc()
分配
c

我一尝试调用
ds.size()
程序就会崩溃。当它试图在
size()
中调用其
begin()
方法时,
EXC\u BAD\u ACCESS
ds
中出现


你知道为什么会这样吗?我已经使用C++几年了,但这是我第一次使用标准容器中的指针,所以也许我缺少一些明显的东西。当您将元素插入容器或类似的东西时,您需要确保您的元素类型支持所有必要的功能(即,其可分配、可复制,并根据容器类成员中需要的功能在其中具有正确的功能)


虽然.size函数应该只返回一个内部成员的值,但这对于崩溃的东西来说没有多大意义。你确定所有东西都在你的真实代码中正确分配了吗?在我看来,调用链中的某个地方有一个未初始化的指针。

据我所知,您的代码不应该以任何方式关心列表ds的内容。当您将元素插入容器或类似的东西时,您需要确保您的元素类型支持所有必要的功能(即,其可分配、可复制,并根据容器类成员中需要的功能在其中具有正确的功能)



虽然.size函数应该只返回一个内部成员的值,但这对于崩溃的东西来说没有多大意义。你确定所有东西都在你的真实代码中正确分配了吗?在我看来,您似乎只是在调用链中的某个位置有一个未初始化的指针。

但是我认为类
A
的成员
b
是默认的,它是
私有的
。也许这会导致
EXC\u BAD\u访问

,但我认为
A类
的成员
b
是默认的
private
。可能是它导致了
EXC\u BAD\u访问

这不足以诊断问题。同时使用调试器来确保
列表
代码中的代码出现错误,我对此深表怀疑。提供一个测试用例来演示这个问题。因此我认为这种结构理论上没有问题,应该可以吗?只要知道我没有错过一些明显的东西就好了。我不会说没有什么“错”。如果没有别的,在我看来,它是如此复杂和不直观,以至于有设计的味道。对我来说,它不是不直观的,如果你看到了实际的类,你就会放心。它通过避免复制来优化OpenGL性能,并允许高度灵活的渲染管理层次结构。这还不足以诊断问题。同时使用调试器来确保
列表
代码中的代码出现错误,我对此深表怀疑。提供一个测试用例来演示这个问题。因此我认为这种结构理论上没有问题,应该可以吗?只要知道我没有错过一些明显的东西就好了。我不会说没有什么“错”。如果没有别的,在我看来,它是如此复杂和不直观,以至于有设计的味道。对我来说,它不是不直观的,如果你看到了实际的类,你就会放心。它通过避免复制来优化OpenGL性能,并允许高度灵活的渲染管理层次结构。我将进一步研究我的代码,并发布我在这里找到的任何内容。啊,问题解决了-我调用了一个超类构造函数,它调用了在子类中重写的虚拟方法,但在子类构造函数中尚未创建重写的方法中所需的属性:)听起来不错。当您开始在复杂类中处理继承时,反引用null非常容易。很高兴你这么快就找到了:)好的,这是我想要的安慰,谢谢。我将进一步研究我的代码,并发布我在这里找到的任何内容。啊,问题解决了-我调用了一个超类构造函数,它调用了在子类中重写的虚拟方法,但在子类构造函数中尚未创建重写的方法中所需的属性:)听起来不错。当您开始在复杂类中处理继承时,反引用null非常容易。很高兴你这么快就找到了:)