我想尝试一下C ++中的PIMPL。
就我而言,我正在使用operator()
访问私有成员。
接口类A
和实现类AImpl
都具有operator() const
和operator()
。
代码显示如下:
#include <iostream>
class AImpl
{
public:
explicit AImpl()
{
x = 0;
}
const int &operator()() const
{
std::cout << "const access in AImpl" << std::endl;
return x;
}
int &operator()()
{
std::cout << "not const access in AImpl" << std::endl;
return x;
}
private:
int x;
};
class A
{
public:
A()
{
impl = new AImpl;
}
~A()
{
delete impl;
}
const int &operator()() const
{
std::cout << "const access in A" << std::endl;
return impl->operator()();
}
int &operator()()
{
std::cout << "not const access in A" << std::endl;
return impl->operator()();
}
private:
AImpl *impl;
};
int main()
{
A non_const_a;
std::cout << non_const_a() << std::endl;
const A const_a;
std::cout << const_a() << std::endl;
}
我使用跟随命令编译程序
g++ Main.cpp
结果显示:
# ./a.out
not const access in A
not const access in AImpl
0
const access in A
not const access in AImpl
0
从结果可以看出:
[A
的const成员函数const int &A::operator()() const
调用int &AImpl::operator()()
,但不调用const int &AImpl::operator()() const
。
在PIMPL情况下,我希望A和AImpl中的成员函数是一一对应的。
我想让const int &A::operator()() const
呼叫const int &AImpl::operator()() const
。
上面提到的是一个简单的例子。在实际情况下,A是一个容器,将在我的代码中广泛使用,因此我不希望修改会降低性能。
我很抱歉这是一个愚蠢的问题。谢谢您的时间。
我也不明白你的结果。在我看来,指针impl
在const
方法范围内应为const
,因此应调用const
的AImpl
方法。
无论如何将A
实现更改为此,都将为您提供所需的行为:
const int &operator()() const
{
std::cout << "const access in A" << std::endl;
return const_cast<const AImpl*>(impl)->operator()();
}