2016-10-28 17 views
6

Chcę użyć klasy w C++, który ma tablicę całkowitą takiego:Korzystanie getter, setter w C++

class A{ 
private: 
     int arr[50]; 

} 

Przeczytam coś z pliku tekstowego tak:

sum i1 i2 

Że oznacza: Suma tablic index1 i index2 i przechowuj w indeks1.

Jak mogę to zrobić, z użyciem pobierające i ustawiające jak:

seti2(geti1()+geti2()) 

czy coś takiego (bo to nie jest bardzo przydatne, nie chcę pisać getter i setter dla każdego geti1 indeksu() geti2() ... geti50())

Masz jakiś pomysł?

Nawiasem mówiąc, moje drugie pytanie brzmi, czy getter nie powinien mieć żadnych parametrów i czy seter powinien mieć tylko jeden parametr?

+3

Czasami warto czytać [Czy pobierające i ustawiające biedny projektu?] (Http://stackoverflow.com/questions/565095/are-getters-and-setters-poor-design-contradictory-advice-seen) –

+1

"Robi się to niewygodne" - więc nie rób tego. Jak myślisz, dlaczego musisz to zrobić? Dlaczego jest prywatny? Albo ** (A) ** powinno być enkapsulowane, jeśli masz jakiś powód, by sprawdzić/zmanipulować wejście przed jego pobraniem/ustawieniem - albo chcesz działać na wyższym poziomie, z klasą wykonującą pracę i po prostu wywołując metody jak 'sortArray()', 'processArray()', itp - _xor_ ** (B) ** nie powinno, więc get/setter są bezcelowe. Jeśli wszystko, czego chcesz, to nieskrępowany dostęp publiczny, akcesory są bezcelowe - po prostu użyj prostej tablicy i przestań udawać enkapsulację jako gest znacznika. –

Odpowiedz

6

Jednym z pomysłów może być użycie rzeczywistych indeksów. Masz więc jedną funkcję: get, która przyjmuje indeks jako argument, oraz jedną funkcję set, która pobiera indeks i wartość jako argumenty.

Innym rozwiązaniem jest przeciążenie funkcji operator[], aby zapewnić ładne indeksowanie tablicowe.

+0

dzięki Wiem, ale moim problemem jest to, jak mogę zrozumieć, który indeks get powinien być wywołanie?Mam na myśli, jeśli plik jest: dodaj i1 i2, powinienem zrobić set (get (i1) + get (i2), i1), ale to jest ogólne rozwiązanie bota jego prywatny, jeśli plik jest dodany i48 i3 jak to zrobić: set (get (48) + get (i3), i48)? –

+1

@ FurkanYıldız To naprawdę inne pytanie. Jeśli ten format jest wszystkim, co trzeba wesprzeć, jest to stosunkowo łatwe przy użyciu prostych funkcji łańcuchowych. Jeszcze jedno pytanie. Najpierw spróbuj najpierw sam (strumienie wejściowe i operator wejściowy '>>' są w zasadzie wszystkim, czego potrzebujesz tutaj), a jeśli tego nie zrobisz, spróbuj utworzyć [Minimalny, kompletny i sprawdzalny przykład] (http://stackoverflow.com/help/mcve) i zamieścić nowe pytanie. –

0

Aby ująć za pomocą Ustawiacz/getter, można użyć, na przykład:

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

Jednak parsowania polecenia odczytu z pliku tekstowego będzie wymagało więcej pracy.

0

Jeśli nadal chcesz skorzystać z nazwiskami swoich dziedzinach, można mieć jeden getter/setter i używać wyliczenie aby kod nieco bardziej sensowne:

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

Jeśli don” t chcesz ręcznie utworzyć wyliczenie i mieć dostęp do bibliotek Boost, możesz użyć BOOST_PP_ENUM_PARAMS. Alternatywnie możesz użyć prostego skryptu powłoki do wygenerowania wyliczenia. Zobacz this stackoverflow question, aby uzyskać więcej informacji na ten temat.

0

Mogę zaproponować:

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

więc można;

get(i); 

set(i, get(x) + get(y)); 
Powiązane problemy