2013-07-22 4 views
2

Я все еще относительно новичок в C++, изучая, как я иду, и я смущен относительно того, что является «лучшим» способом разоблачить вектор для его потребителей. Я не беспокоюсь о производительности.доступ к std :: вектору, содержащемуся другим классом

У меня есть класс, который содержит вектор raw data. У меня есть другие классы, которые должны потреблять и обрабатывать этот вектор.

От чтения других сообщений здесь Я не уверен, вернуть ли const ссылку на вектор или выставить const iterators, так как никто из потребителей не изменит вектор.

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

typedef std::vector<int> RawNumberContainer; 
typedef std::vector<int>::const_iterator RawNumberIterator; 

class RawData 
{ 
public: 
    RawData(); 

    void addNumber(int number) 
    { 
    rawNumbers.push_back(number); 
    } 

    // this? 
    RawNumberContainer getRawNumbers() { return rawNumbers; } 

    // or this? 
    const RawNumberContainer& getRawNumbersConstReference() { return rawNumbers; } 

    // or this? 
    RawNumberIterator getRawNumbersBeginning() { return rawNumbers.begin(); } 
    RawNumberIterator getRawNumbersEnd() { return rawNumbers.begin(); } 


private: 
    RawNumberContainer rawNumbers; 
}; 

class Something; 
class RawDataConsumer 
{ 
public: 
    // ?? 
    Something* processRawData(RawNumberContainer&); 

    // ?? 
    Something* processRawData(const RawNumberContainer&); 

    // ?? 
    Something* processRawData(RawNumberIterator begin, RawNumberIterator end); 
}; 
+2

Вместо имен, как 'getRawNumbersBeginning()' и 'getRawNumbersEnd()', вы можете просто выбрать 'начать()' и 'конец() '. Они лучше, и ваш класс будет вести себя как контейнеры, и вы сможете использовать его также в цикле for for for. – Nawaz

+0

Рассмотрите также константные итераторы – doctorlove

+0

Или вы можете просто забыть обо всех этих уроках и использовать вектор напрямую ... Я имею в виду, что если все ваши 'RawData' собираются сделать, это удерживать вектор и публиковать общедоступные методы вектора, то это Вы знаете, это бесполезно. Вы сказали, что у вас есть другой класс, который должен потреблять и обрабатывать этот вектор. Ну, разве вы не думаете, что было бы неплохо сохранить данные, над которыми он работает? – jrok

ответ

1

Он:

const RawNumberContainer& getRawNumbersConstReference() const { return rawNumbers; } 

И:

Something* processRawData(const RawNumberContainer&); 
+0

Это было мое предпочтение. Я думаю, что это лучше показывает намерение, что вектор не предназначен для изменения. – RobertW

0

Вы можете использовать:

RawNumberContainer getRawNumbers() const { return rawNumbers; } 

Таким образом, вы убедитесь, что вы не можете изменить вектор (только доступ только для чтения) и избавить вас от другой переменной быть вручную, объявленной в код.

Смежные вопросы