1

我的代码中有一个片段:

const std::pair<Info, const ElementHandler&>& handle () const {
                    FileHandler fileHandler = FileHandler();
                    std::pair<Info, const ElementHandler&> result = std::pair<Info, const FileHandler&> ( info, fileHandler );
                    return result;
                }

我有以下编译错误:

error: cannot declare field ‘std::pair<Synchronizer::Info, Synchronizer::ElementHandler>::second’ to be of abstract type ‘Synchronizer::ElementHandler’

我如何编写代码来保留这个想法?有可能,还是我需要使用指针和动态分配?

4

3 回答 3

1

“避免在本地范围内动态分配”。

如果这是您损坏的代码背后的驱动需求,那么我不会跟风告诉您如何修复它以做您不想要的事情;-)。相反,您必须正确考虑其影响。您必须有一些变量,其范围与调用者的需求相匹配。必须排除局部自动变量——它们在函数返回时被销毁。所以,你可以:

  • 使用函数作用域static变量或全局变量,但每次调用函数时都是同一个变量,并且可能存在线程安全问题(您的编译器可能支持某些线程特定的关键字,并且 POSIX 具有支持线程的函数- 特定数据 - 但每个线程 1 个对象可能仍然过于受限)
  • 为许多变量创建一些带有空间的缓冲区,并控制它们的生命周期并以适合客户端代码的某种方式重用(例如,在知道客户端将按照它们返回的顺序释放它们并且永远不需要超过同时数组大小)
  • 让客户端代码担心生命周期(他们可能比你知道的更多)并提供一个你要加载结果的变量(例如bool load_my_x(X&);
    • 这里的一个问题是调用者需要为 FileHandler 分配空间,而不仅仅是 ElementHandler
于 2012-04-17T09:16:26.287 回答
1
  1. fileHandler与 一起分配new,或者可能作为某种shared_ptrfileHandler一旦函数退出,当前对的引用将无效。
  2. 按值返回result,而不是按引用返回。
于 2012-04-17T09:08:24.060 回答
1

无论如何,您都需要使用动态分配。

在您的函数中,您正在创建一个局部变量“fileHandler”并返回对它的引用。一旦函数返回,'fileHandler' 就会超出范围并被破坏,从而使引用无效。

我认为您可以使用智能指针(unique_ptr、shared_ptr、...)很好地解决这个问题。您的智能指针可以指向 ElementHandler,如果 ElementHandler 有一个虚拟析构函数,那么如果该对被删除或超出范围,它就会被正确地析构。

于 2012-04-17T09:10:47.803 回答