Коллекция объектов в C++ (обзор кода)
Всем Привет,
Я создал следующий сегмент кода, я получаю ожидаемое поведение, но, возможно, у вас есть лучший способ поделиться мной, чтобы получить тот же результат.
Вот код, которым я хотел бы поделиться с вами:
#include <iostream> #include <memory> #include <vector> #include <algorithm> using namespace std; template<class T, size_t N> constexpr size_t size(T (&)[N]) { return N; } class Group { private: vector<signed long> _channels; int _id{0}; public: Group() = delete; Group(signed long channels[], size_t size, int id) { _channels.assign(channels, channels + size); _id = id; } int getId() const { return _id; } int channelCount() const { return _channels.size(); } signed long getChannel(int index) const { if (index < 0 || index >= channelCount()) throw "Invalid channel index"; return _channels[index]; } vector<signed long> Channels() const { return _channels; } }; class Groups { private: vector<unique_ptr<Group>> _groups; int _groupIndex{0}; public: Groups(){}; int Add(signed long channels[], size_t size) { _groupIndex++; _groups.push_back(make_unique<Group>(channels, size, _groupIndex)); return _groupIndex; } int Size() const { return _groups.size(); } void Clear() { return _groups.clear(); } Group operator[](int index) { return getIten(index); } Group getIten(int index) { if (index < 0 || index >= Size()) throw "Invalid group index"; return *_groups[index].get(); } }; int main() { Groups groups; signed long grp1Channels[] = {0, 3, 5}; groups.Add(grp1Channels, size(grp1Channels)); signed long grp2Channels[] = {6, 8, 10}; groups.Add(grp2Channels, size(grp2Channels)); cout<< groups.Size() << endl; cout<< groups[0].channelCount() << endl; for (signed long channel : groups[0].Channels()) { cout << channel << endl; } cout<< groups[0].getId() << endl; return 0; }
На выходе получается следующее:
>>> $main <<<< 2 3 0 3 5 1
Я беспокоился о getItem, чтобы увидеть, хорошо ли возвращать указатель группы, а не Группы. В настоящее время это находится в режиме только для чтения, но что произойдет, если я захочу изменить значение канала, например? Как вы думаете, что было бы лучшим гибким способом ?
Заранее Вам большое спасибо.
С уважением.
Мики
Что я уже пробовал:
Я создал код выше.
Gerry Schmitz
Жизнь слишком коротка, чтобы возиться с вещами, которые "работают" только для того, чтобы увидеть, может ли она быть "лучше" (в данном случае).
https://martinfowler.com/bliki/Yagni.html