我想在C ++中使用具有如下整数数组的类:
class A{
private:
int arr[50];
}
我会从文本文件中读到这样的东西:
sum i1 i2
这意味着:数组的总和index1和index2并存储在index1中。
如何使用getter和setter之类的方法:
seti2(geti1()+geti2())
或类似的东西,(因为它不是很有用,我不想为每个索引写入getter和setter geti1()geti2()... geti50())
你有什么想法吗?
顺便说一句,我的第二个问题是,getter不应该有任何参数,而setter应该只有一个参数吗?
答案 0 :(得分:6)
一个想法可能是使用实际索引。所以你有一个get
函数,它将一个索引作为参数,一个set
函数将索引和值作为参数。
另一个解决方案是重载operator[]
函数,以提供类似数组的索引。
答案 1 :(得分:0)
要使用setter / getter进行封装,您可以使用,例如:
class A{
private:
int arr[50];
public:
int get(int index);
void set(int index, int value);
}
...
int A::get(int index) {
return arr[index];
}
void A::set(int index, int value) {
arr[index] = value;
}
..
instanceOfA->set(1, instanceOfA->get(1) + instanceOfA->get(2));
但是,解析从文本文件中读取的命令将需要更多的工作。
答案 2 :(得分:0)
如果您仍想利用字段的名称,可以使用单个getter / setter并使用枚举来使代码更有意义:
class A{
public:
enum Index
{
INDEX_SUM,
INDEX_I1,
INDEX_I2,
INDEX_I3,
...
INDEX_I50,
};
int geti(const Index index);
void seti(const Index index, const int value);
private:
int arr[50];
};
int A::geti(const Index index)
{
return arr[static_cast<int>(index)];
}
void A::seti(const Index index, const int value)
{
// Maybe don't allow "sum" to be set manually?
if (INDEX_SUM == index)
throw std::runtime_error("Cannot set sum manually");
arr[static_cast<int>(index)] = value;
// Maybe update sum?
arr[INDEX_SUM] = std::accumulate(arr, arr + 50, 0);
}
如果您不想手动创建枚举,并且可以访问Boost库,则可以使用BOOST_PP_ENUM_PARAMS
。或者,您可以使用简单的shell脚本来生成枚举。有关详细信息,请参阅this stackoverflow question。
答案 3 :(得分:0)
我可以建议:
class A{
private:
const int ARR_SIZE = 50;
int arr[ARR_SIZE];
public:
int get(int _iIndex)
{
return arr[_iIndex];
}
void set(int _iIndex, int _iValue)
{
if (_iIndex < ARR_SIZE)
arr[_iIndex] = _iValue;
}
}
所以你可以;
get(i);
set(i, get(x) + get(y));