在c ++

时间:2016-10-28 08:59:49

标签: c++ c++11

我想在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应该只有一个参数吗?

4 个答案:

答案 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));