我想在向量中保存某些结构Data
。这些结构通过索引(而不是指针)引用其他结构,以节省内存并简化序列化。为了遵循这些索引,我创建了一个类DataView
,它为此提供了一个舒适的界面。看起来像这样:
#include <iostream>
#include <vector>
struct Data
{
int id_next;
int id_prev;
int value;
};
class Foo;
class DataView
{
Foo * foo;
int index;
public:
DataView( Foo * foo_, int index_ )
: foo( foo_ ), index( index_ )
{
}
DataView next() const;
DataView prev() const;
int value() const;
int & value();
int id() const
{
return index;
}
};
class Foo
{
std::vector<Data> data;
public:
friend class DataView;
DataView dataview( int index )
{
return DataView( this, index );
}
Foo()
{
data.resize( 5 );
for ( int i = 0; i < (int)data.size(); i++ )
{
data[i].id_next = (i + 1) % data.size();
data[i].id_prev = (i + 4) % data.size();
data[i].value = i * i;
}
}
void write_cycle( int start_index ) // const
{
DataView seek = dataview( start_index );
do
{
std::cout << "index " << seek.id() << " value " << seek.value() << std::endl;
seek = seek.next();
} while ( seek.id() != start_index );
}
};
DataView DataView::next() const
{
return DataView( foo, foo->data[index].id_next );
}
DataView DataView::prev() const
{
return DataView( foo, foo->data[index].id_prev );
}
int DataView::value() const
{
return foo->data[index].value;
}
int & DataView::value()
{
return foo->data[index].value;
}
int main()
{
Foo foo;
foo.write_cycle( 3 );
foo.dataview( 2 ).value() = 11;
foo.write_cycle( 3 );
return 0;
}
如果我必须区分
dataview
方法的const和非const变体,就会出现问题。实际上,write_cycle
应该是const,因为它不会改变任何内容。但是,如果取消注释const
限定符,则会出现编译器错误。错误:将“ const Foo”作为“ this”参数传递会舍弃限定词[-fpermissive]
如何编写包含常量或非常量
DataView
指针的foo
,具体取决于其构造函数是使用const指针还是使用非const指针调用? 最佳答案
你说:
这些结构通过索引(而不是指针)引用其他结构,以节省内存并简化序列化。为了遵循这些索引,我创建了一个类DataView
,它为此提供了一个舒适的界面。
这向我表明您不需要支持:
foo.dataview( 2 ).value() = 11;
使用
DataView
仅读取数据。如果您同意,则可以更改DataView
来存储Foo const*
。然后,您可以摆脱const
的非DataView::value()
版本。class DataView
{
Foo const* foo;
int index;
public:
DataView( Foo const* foo_, int index_ )
: foo( foo_ ), index( index_ )
{
}
DataView next() const;
DataView prev() const;
int value() const;
// Don't need this.
// int & value();
int id() const
{
return index;
}
};
关于c++ - C++:如何根据上下文创建一个包含指针的常量或非常量临时对象?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48196861/