我的代码中有一个代码段:
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’
我如何编写代码来保存这个想法?是可能的,还是我需要使用指针和动态分配?
答案 0 :(得分:1)
fileHandler
与new
分配,或者可能作为某种shared_ptr
。函数退出后,对fileHandler
的当前引用将无效。result
,而不是按引用返回。答案 1 :(得分:1)
无论如何,你需要使用动态分配。
在您的函数中,您正在创建一个局部变量'fileHandler'并返回对它的引用。一旦函数返回,'fileHandler'就会超出范围并被破坏,导致引用无效。
我认为你可以使用智能指针(unique_ptr,shared_ptr,...)很好地解决这个问题。您的智能指针可以指向ElementHandler,如果ElementHandler有一个虚拟析构函数,如果该对被删除或超出范围,它将被正确销毁。
答案 2 :(得分:1)
“避免在本地范围内进行动态分配”。
如果这是您破损代码背后的驱动需求,那么我不会通过告诉您如何修复它来做您不想要的事情来跟踪趋势;-)。相反,你必须正确考虑其含义。您必须拥有一个变量,其范围与调用者的需求相匹配。必须排除本地自动变量 - 它们在函数返回时被销毁。所以,你可以:
static
变量或全局变量,但每次调用函数时都是相同的变量,并且可能存在线程安全问题(您的编译器可能支持某些特定于线程的关键字) ,POSIX具有支持特定于线程的数据的功能 - 但每个线程的1个对象可能仍然限制太多)bool load_my_x(X&);
)