首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使一组相互依赖的类全局可访问?

如何使一组相互依赖的类全局可访问?
EN

Stack Overflow用户
提问于 2022-03-02 21:03:35
回答 2查看 55关注 0票数 -1

我有许多相互依赖的类,它们在一个作用域内使用时可以正常工作。现在,我想让它们的实例在几个过程/范围内工作。可能是因为我缺乏对C++的深入了解,所以我很难很好地实现这个目标。

我将首先描述工作正常的(开始)情况。

在这里,我实例化了例程test_recorder()中的类对象

代码语言:javascript
复制
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中的对象。然后,我在另一个例程中使用记录器对象:

代码语言:javascript
复制
   AdvancedSequencer *ptrAdvancedSequencer;
   MIDIRecorder *ptrMIDIRecorder;

   void test_recorder( void ) { 
     AdvancedSequencer ptrAdvancedSequencer(&text_n);
     MIDIRecorder ptrMIDIRecorder(&ptrAdvancedSequencer);
     ...
     ...}

  void use_recorder(void){
    ...
    ...
    ptrMIDIRecorder->EnableTrack(1);
    ...
    ...}

这将导致运行时错误,错误跟踪的顶部如下所示:

代码语言:javascript
复制
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

当然,我觉得这与如何处理类对象有关。但我还没找到线索。任何建议都是非常感谢的!

EN

回答 2

Stack Overflow用户

发布于 2022-03-02 21:12:05

你用的是名字跟踪。也就是说,你有:

代码语言:javascript
复制
AdvancedSequencer *ptrAdvancedSequencer;
void test_recorder( void ) { 
    AdvancedSequencer ptrAdvancedSequencer(&text_n);

    ...
}

这些都不是同一个变量。它们是记忆中不同的地方。此外,一旦退出此方法,将释放在该方法中分配的数据。

相反,你必须这样做:

代码语言:javascript
复制
void test_recorder( void ) { 
    ptrAdvancedSequencer = new AdvancedSequencer(&text_n);

   ...
}

然后用它作为指针。但是,您还需要在以后清理它的某个地方,因为您现在已经分配了空间。

票数 2
EN

Stack Overflow用户

发布于 2022-03-02 23:40:48

我想出了Jospeh Larson的建议(谢谢!)我在这里张贴工作解决方案,因为它包含一个小但重要的细节,这是我的另一个发现。对于那些技术水平较高的人来说,这可能不那么令人惊讶:-)

代码语言:javascript
复制
   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)中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71329110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档