Предположим, у меня есть библиотека, которую я хочу скрыть. В этой библиотеке есть функция называется «весело»C++ pimpl avoiding void *
//Both class1 and class2 are defined in the library I want to hide
class1 fun(class2 P)
Я создаю Pimpl для class1 и class2 в настоящее время. Как мне реализовать функцию «весело»? Код для class1_pimpl и class2_pimpl ниже
//class1_pimpl.hpp
class class1_pimpl
{
public:
class1_pimpl(int value);
~class1_pimpl();
private:
class Impl;
std::unique_ptr<Impl> pimpl_;
};
//class2_pimpl.hpp
class class2_pimpl
{
public:
class2_pimpl(int value);
~class2_pimpl();
private:
class Impl;
std::unique_ptr<Impl> pimpl_;
};
Я могу только выяснить, если эта функция относится только к одному классу, например,
int fun_simple(class1 c, int i)
так, как я решить fun_simple, как ниже:
//class1_pimpl.cpp
class class1_pimpl::Impl
{
public:
Impl(int value)
: value_ {value}
{}
int fun_simple(i)
{
return value_ + i;
}
private:
int value_;
};
class1_pimpl::class1_pimpl(int value)
: pimpl_{new Impl(value)}
{}
class1_pimpl::~class1_pimpl()
{}
int class1_pimpl::fun_simple(int i)
{
return pimpl_->fun_simple(i);
}
Благодарности
Если 'fun' - это функция, не являющаяся членом, которая работает только с общими интерфейсами' class1' и 'class2', вам необходимо убедиться, что версии' pimpl' также поддерживают эти интерфейсы. –
Кроме того, использование 'unique_ptr' с не устраняет необходимость в определении конструктора копирования и оператора присваивания копий. –
Непонятно, где находится проб. Вы получаете какие-либо ошибки компилятора? –