我有许多相互依赖的类,它们在一个作用域内使用时可以正常工作。现在,我想让它们的实例在几个过程/范围内工作。可能是因为我缺乏对C++的深入了解,所以我很难很好地实现这个目标。
我将首先描述工作正常的(开始)情况。
在这里,我实例化了例程test_recorder()中的类对象
void test_recorder(void) {
MIDISequencerGUINotifierText text_n;
AdvancedSequencer sequencer(&text_n);
MIDIRecorder recorder(&sequencer);
...
...
recorder.EnableTrack(1); //use a member of recorder object
...
... }现在,我想在其他函数中使用这些类的成员。因此,我想我必须使这些类的实例具有全局可访问性。我把test_recorder中的前三行放到了全局级别,不包括任何函数。编译器接受了这个测试,但是在运行时我得到一个错误,在死后没有任何明确的线索。
然后,我决定尝试在全局级别定义指向对象的指针,并使用这些指针实例化test_recorder中的对象。然后,我在另一个例程中使用记录器对象:
AdvancedSequencer *ptrAdvancedSequencer;
MIDIRecorder *ptrMIDIRecorder;
void test_recorder( void ) {
AdvancedSequencer ptrAdvancedSequencer(&text_n);
MIDIRecorder ptrMIDIRecorder(&ptrAdvancedSequencer);
...
...}
void use_recorder(void){
...
...
ptrMIDIRecorder->EnableTrack(1);
...
...}这将导致运行时错误,错误跟踪的顶部如下所示:
0x401a0d6c: vprintf at /builds/idf/crosstool-NG/.build/HOST-x86_64-w64-mingw32/xtensa-esp32-elf/src/newlib/newlib/libc/stdio/vprintf.c:30
0x400910ec: memcpy at /builds/idf/crosstool-NG/.build/HOST-x86_64-w64-mingw32/xtensa-esp32-elf/src/newlib/newlib/libc/machine/xtensa/memcpy.S:163
0x40091102: memcpy at /builds/idf/crosstool-NG/.build/HOST-x86_64-w64-mingw32/xtensa-esp32-elf/src/newlib/newlib/libc/machine/xtensa/memcpy.S:197当然,我觉得这与如何处理类对象有关。但我还没找到线索。任何建议都是非常感谢的!
发布于 2022-03-02 21:12:05
你用的是名字跟踪。也就是说,你有:
AdvancedSequencer *ptrAdvancedSequencer;
void test_recorder( void ) {
AdvancedSequencer ptrAdvancedSequencer(&text_n);
...
}这些都不是同一个变量。它们是记忆中不同的地方。此外,一旦退出此方法,将释放在该方法中分配的数据。
相反,你必须这样做:
void test_recorder( void ) {
ptrAdvancedSequencer = new AdvancedSequencer(&text_n);
...
}然后用它作为指针。但是,您还需要在以后清理它的某个地方,因为您现在已经分配了空间。
发布于 2022-03-02 23:40:48
我想出了Jospeh Larson的建议(谢谢!)我在这里张贴工作解决方案,因为它包含一个小但重要的细节,这是我的另一个发现。对于那些技术水平较高的人来说,这可能不那么令人惊讶:-)
AdvancedSequencer *ptrAdvancedSequencer;
MIDIRecorder *ptrMIDIRecorder;
void test_recorder( void ) {
ptrAdvancedSequencer = new AdvancedSequencer(&text_n);
ptrMIDIRecorder = new MIDIRecorder(ptrAdvancedSequencer);
...
...}
void use_recorder(void){
...
...
ptrMIDIRecorder->EnableTrack(1);
...
...}与我问题中的代码相比,细节是缺少的&在新的MIDIRecorder(ptrAdvancedSequencer)中。
https://stackoverflow.com/questions/71329110
复制相似问题