情境: 我通过,例如一个2D矩阵作为函数中的参数,我希望能够读取和更改所有元素,但是 我想防止任何意外写入让我们说最后一栏。所以我想以某种方式告诉编译器使用此函数中的特定元素作为常量。
可能无法完成,但在某些情况下会有用。
答案 0 :(得分:5)
数组是 common 类型的连续对象块;所以你所建议的内容不受支持。
适当的解决方案是封装数组并通过可以应用所需语义的函数访问它。实际上,如果您使用C ++,则可以将[]
运算符重载的类封装在一起,这样您就可以在使用数组访问表示法的同时应用所需的语义。
答案 1 :(得分:0)
不,这是不可能的。这是因为array
必须是普通类型,虽然int
看起来与const int
相同,但它的类型不同。
答案 2 :(得分:0)
In Fortran this is not possible. It does not have any two distinct type as int
and const int
in the other languages but still you can't just automatically protect a part of array from being modified. The intent(in)
argument attribute can also protect only the array as a whole.
Just be sure you program your procedure right and test it thoroughly. You can use debuggers to test if a certain part of memory is modified or not.
答案 3 :(得分:0)
这是C ++中可能性的草图
class Item {
protected:
int <or some other type> value;
public:
Item(int x) : value (x) {};
int Get() const ( return value; };
void Set(int x) { throw std::runtime_error("Oh Dear!");
};
class Settable : public Item {
public:
void Set(int x) { value = x; };
};
然后2D矢量(我们使用C ++)可以
std::vector<std::vector<std::shard_ptr<item>>> list;
然后用上述对象的其他一个实例填充靴子。处理异常!
答案 4 :(得分:-1)
我建议你在用户试图覆盖它们时跳过这些元素。