Edit1: я понимаю, что этот вопрос трудно понять без понимания того, что я пытаюсь сделать. Класс A не завершен, но он по существу обозначает C-массив «proxy» (или «viewer» или «sampleler»). Одно интересное использование также представляет C-массив в виде 2d-сетки (соответствующая функция здесь не показана). Свойство этого класса:
- данные не должны владеть - нет глубокого копирования
- должно быть копируемым / присваиваемым
- должно быть легким (
- это должно сохранить постоянство (у меня проблемы с этим)
Пожалуйста, не ставьте под сомнение цель или замысел: они являются гипотезой вопроса.
Первый код:
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 указывает?
Обратите внимание, что я действительно хочу, чтобы мой класс был копируемым / назначаемым, я просто не хочу, чтобы он терял свою постоянство в процессе.
Edit0: я также хочу иметь указатель там, и нет глубокого копирования, пожалуйста (скажем, указатель может быть гигантским массивом).
Edit2: благодаря ответам я пришел к выводу, что полезно иметь «конструктор const» (по крайней мере, в этом контексте). Я посмотрел и, конечно, я не тот, кто пришел к такому выводу. Вот интересная дискуссия:
http://www.rhinocerus.net/forum/language-c-moderated/569757-const-constructor.html
Edit3: Наконец-то есть то, чем я доволен. Спасибо за вашу помощь. Дальнейшие отзывы более чем приветствуются
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;
}