编辑1:我意识到如果没有了解我想要做什么,很难理解这个问题。A类并不完整,但实质上代表了C数组的“代理”(或“查看器”或“采样器”)。其有趣的用法之一是将C数组呈现为2D网格(相关函数未在此处显示)。该类的属性如下:
- 它不应该拥有数据-没有深拷贝
- 它应该可以复制/分配
- 它应该轻量级(
- 它应该保持constness(我对此有困惑)
请不要质疑目的或设计:它们是问题的假设。
首先是一些代码:
class A
{
private:
float* m_pt;
public:
A(float* pt)
:m_pt(pt)
{}
const float* get() const
{
return m_pt;
}
void set(float pt)
{
*m_pt = pt;
}
};
void gfi()
{
float value = 1.0f;
const A ac(&value);
std::cout<<(*ac.get())<<std::endl;
A a = ac;
a.set(2.0f);
std::cout<<(*ac.get())<<std::endl;
}
调用“gfi”将生成以下输出:
1
2
给 a 赋值为 ac 是一种简单的方法来快速取消 ac 的常数性。有更好的方法来保护 m_pt 指向的值吗?
请注意,我确实希望我的类可以被复制/赋值,但我不希望在此过程中失去其常数性。
编辑0:我还希望在其中有一个指针,并且不需要深度复制(假设指针可以是一个巨大的数组)。
编辑2:由于答案的帮助,我得出结论“const构造函数”将是一个有用的东西(至少在这个上下文中)。我查了一下,当然我不是唯一一个得出这个结论的人。这里有一个有趣的讨论: http://www.rhinocerus.net/forum/language-c-moderated/569757-const-constructor.html 编辑3:最后得到了我满意的结果。感谢您的帮助。进一步的反馈将不胜感激。
template<typename T>
class proxy
{
public:
typedef T elem_t;
typedef typename boost::remove_const<T>::type elem_unconst_t;
typedef typename boost::add_const<T>::type elem_const_t;
public:
elem_t* m_data;
public:
proxy(elem_t* data = 0)
:m_data(data)
{}
operator proxy<elem_const_t>()
{
return proxy<elem_const_t>(m_data);
}
}; // end of class proxy
void test()
{
int i = 3;
proxy<int> a(&i);
proxy<int> b(&i);
proxy<const int> ac(&i);
proxy<const int> bc(&i);
proxy<const int> cc = a;
a=b;
ac=bc;
ac=a;
//a=ac; // error C2679: binary '=' : no operator found which takes a right-hand operand of type...
//ac.m_data[0]=2; // error C3892: 'ac' : you cannot assign to a variable that is const
a.m_data[0]=2;
}