クラスには。が含まれますstd::vector<int*>
。外部コードは、このベクトルへの読み取り専用アクセスを必要とし、コンテンツ(ポインターまたはそのコンテンツのいずれも)を変更できないようにする必要があります。クラス内では、値が変更される可能性があります(たとえばdouble_values()
、など、値をaとして保存することstd::vector<const int*>
はできません。
コピーを作成せずにをstd::vector<int*>
として返す方法はありますか?std::vector<const int*>
constはコンパイル時に何を変更できるか、何を変更できないかを言うために動作しているだけなので、あるべきだと感じます。
コード:(でコンパイルg++ -std=c++0x
)
class ReadOnlyAccess
{
public:
ReadOnlyAccess(const std::vector<int*> & int_ptrs_param):
int_ptrs(int_ptrs_param)
{
}
const std::vector<int*> & get_int_ptrs() const
{
return int_ptrs;
}
std::vector<const int*> safely_get_int_ptrs() const
{
// will not compile (too bad):
// return int_ptrs;
// need to copy entire vector
std::vector<const int*> result(int_ptrs.size());
for (int k=0; k<int_ptrs.size(); k++)
result[k] = int_ptrs[k];
return result;
}
void double_values()
{
for (int*p : int_ptrs)
*p *= 2;
}
void print() const
{
for (const int * p : int_ptrs)
std::cout << *p << " ";
std::cout << std::endl;
}
private:
std::vector<int*> int_ptrs;
};
int main() {
ReadOnlyAccess roa(std::vector<int*>{new int(10), new int(20), new int(100)});
std::vector<const int*> safe_int_ptrs = roa.safely_get_int_ptrs();
// does not compile (good)
// *safe_int_ptrs[0] = -100000;
roa.print();
const std::vector<int*> & int_ptrs = roa.get_int_ptrs();
// changes are made to the internal class values via the accessor! nooooo!
*int_ptrs[0] = -100000;
roa.print();
return 0;
}