2016-10-28 17 views
6

Tôi muốn sử dụng một lớp trong C++ có một mảng số nguyên như thế này:dùng getter, setter trong C++

class A{ 
private: 
     int arr[50]; 

} 

Tôi sẽ đọc một cái gì đó từ tập tin văn bản như thế này:

sum i1 i2 

Đó có nghĩa là: Tổng các mảng chỉ mục1 và chỉ mục2 và lưu trữ trong chỉ mục1.

Làm thế nào tôi có thể làm điều đó, với việc sử dụng getter và setter như:

seti2(geti1()+geti2()) 

hoặc một cái gì đó như thế, (vì nó không phải là rất hữu ích, tôi không muốn viết getter và setter cho mỗi geti1 index() geti2() ... geti50())

Bạn có ý tưởng gì không?

Nhân tiện, câu hỏi thứ hai của tôi là, getter không nên có bất kỳ tham số nào và setter chỉ nên có một tham số?

+3

Bạn có thể muốn đọc [Are getter và setter thiết kế nghèo?] (Http://stackoverflow.com/questions/565095/are-getters-and-setters-poor-design-contradictory-advice-seen) –

+1

'Làm điều này là bất tiện' - vì vậy đừng làm điều đó. Tại sao bạn nghĩ rằng bạn cần phải làm điều đó? Tại sao nó riêng tư? Hoặc ** (A) ** cần được đóng gói, nếu bạn có lý do nào đó để kiểm tra/thao tác đầu vào trước khi nhận/cài đặt nó - hoặc bạn muốn hoạt động ở mức cao hơn, với lớp đang làm việc và bạn chỉ cần gọi phương thức như 'sortArray()', 'processArray()', vv - _xor_ ** (B) ** nó không nên, vì vậy get/setter là vô nghĩa. Nếu tất cả những gì bạn muốn là truy cập công cộng chưa được cộng dồn, những người truy cập là những người không biết gì - chỉ cần sử dụng một mảng đơn giản, và ngừng giả vờ là có đóng gói như một cử chỉ mã thông báo. –

Trả lời

6

Một ý tưởng có thể là sử dụng các chỉ mục thực tế. Vì vậy, bạn có một hàm get duy nhất có chỉ mục làm đối số và một hàm set duy nhất có chỉ mục và giá trị làm đối số.

Một giải pháp khác là quá tải hàm operator[], để cung cấp chỉ mục giống như mảng tốt.

+0

cảm ơn tôi biết nhưng vấn đề của tôi là làm thế nào tôi có thể hiểu được chỉ số của nhận được nên gọi?Tôi có nghĩa là nếu tập tin là: thêm i1 i2, tôi nên làm thiết lập (nhận (i1) + nhận (i2), i1) nhưng đó là giải pháp chung chung của nó riêng của nó, nếu tập tin được thêm i48 i3 làm thế nào tôi có thể làm điều này: set (get (48) + nhận (i3), i48)? –

+1

@ FurkanYıldız Đó thực sự là một câu hỏi khác. Nếu định dạng đó là tất cả những gì bạn cần để hỗ trợ thì nó tương đối dễ sử dụng các hàm chuỗi đơn giản. Vẫn còn một câu hỏi khác. Trước tiên, trước tiên hãy thử nó (các luồng đầu vào và toán tử đầu vào '>>' về cơ bản là tất cả những gì bạn cần ở đây), và nếu bạn không quản lý nó, hãy thử tạo một [Ví dụ tối thiểu, đầy đủ và có thể xác minh] (http://stackoverflow.com/help/mcve) và đăng câu hỏi mới. –

0

Để đóng gói sử dụng setter/getter, bạn có thể sử dụng, ví dụ:

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

Tuy nhiên, phân tích cú pháp lệnh đọc từ tập tin văn bản sẽ yêu cầu làm việc nhiều hơn.

0

Nếu bạn vẫn muốn tận dụng những cái tên của các lĩnh vực của bạn, bạn có thể có một getter đơn/setter và sử dụng một điều tra để làm cho mã của bạn một chút ý nghĩa hơn:

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

Nếu bạn don' t muốn tự tạo enum và có quyền truy cập vào thư viện Boost, bạn có thể sử dụng BOOST_PP_ENUM_PARAMS. Ngoài ra, bạn có thể sử dụng một kịch bản lệnh shell đơn giản để tạo ra enum. Xem this stackoverflow question để biết thêm thông tin về điều đó.

0

Tôi có thể đề nghị:

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

Vì vậy, bạn có thể;

get(i); 

set(i, get(x) + get(y)); 
Các vấn đề liên quan