2016-10-28 3 views
6

Я хочу использовать класс в C++, который имеет целочисленный массив так:Использование геттер, сеттер в C++

class A{ 
private: 
     int arr[50]; 

} 

Я прочитал кое-что из текстового файла, как это:

sum i1 i2 

Это означает: сумма массивов index1 и index2 и сохранение в index1.

Как я могу это сделать, с помощью методов получения и установки, как:

seti2(geti1()+geti2()) 

или что-то подобное, (потому что это не очень полезно, я не хочу писать геттер и сеттер для каждого индекса geti1() geti2() ... geti50())

У вас есть идея?

Кстати, мой второй вопрос в том, что у геттера не должно быть никаких параметров, а у установщика должен быть только один параметр?

+3

Вы можете прочитать [Are добытчиками и сеттеров плохой дизайн?] (Http://stackoverflow.com/questions/565095/are-getters-and-setters-poor-design-contradictory-advice-seen) –

+1

«Делать это неудобно» - так что не делайте этого. Почему вы думаете, что вам нужно это сделать? Почему он частный? Либо ** (A) ** он должен быть инкапсулирован, если у вас есть какая-то причина для проверки/управления вводом перед его/ее настройкой - или вы хотите работать на более высоком уровне, с классом, выполняющим работу, и вы просто вызываете методы например 'sortArray()', 'processArray()' и т. д. - _xor_ ** (B) ** это не должно, поэтому get/setter бессмысленны. Если все, что вам нужно, - это неабстрактный общедоступный доступ, аксессоры - бессмысленное раздувание - просто используйте простой массив и перестаньте притворяться, что есть инкапсуляция в качестве жетона. –

ответ

6

Одной из идей может быть использование фактических индексов. Таким образом, у вас есть одна функция get, которая принимает индекс в качестве аргумента и одну функцию set, которая принимает индекс и значение в качестве аргументов.

Другим решением является перегрузка функции operator[], чтобы обеспечить удобное индексирование массива.

+0

спасибо, что знаю, но моя проблема в том, как я могу понять, какой индекс get должен быть вызван?Я имею в виду, если файл есть: добавьте i1 i2, я должен установить set (get (i1) + get (i2), i1), но это общее решение для его общего, если файл добавляет i48 i3, как я могу это сделать: set (get (48) + get (i3), i48)? –

+1

@ FurkanYıldız Это действительно другой вопрос. Если этот формат - все, что вам нужно для поддержки, то это относительно легко, используя простые строковые функции. Еще один вопрос. Сначала попробуйте сначала (входные потоки и оператор ввода '>>' в основном все, что вам нужно здесь), и если вы не справитесь с этим, попробуйте создать [Минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve) и опубликовать новый вопрос. –

0

инкапсулировать с помощью сеттер/геттер, вы можете использовать, например:

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

Однако разбор команды чтения из текстового файла, потребуется больше усилий.

0

Если вы все еще хотите, чтобы воспользоваться именами ваших полей, вы можете иметь один геттер/сеттер и использовать перечисление, чтобы сделать ваш код немного более значимым:

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); 
} 

Если вы не» t хотите вручную создать перечисление и иметь доступ к библиотекам Boost, вы можете использовать BOOST_PP_ENUM_PARAMS. Кроме того, вы можете использовать простой сценарий оболочки для генерации перечисления. См. this stackoverflow question для получения дополнительной информации.

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)); 
Смежные вопросы