Получение и редактирование приватных членов объектов в векторе - PullRequest
0 голосов
/ 29 апреля 2011

У меня есть код, который добавляет несколько объектов в вектор. Затем я хочу извлечь конкретный объект из вектора и иметь возможность записывать и редактировать его закрытые переменные-члены.

Это код, который у меня сейчас есть:

class Product {
public:
    Product(int n, const string& na, int p)
            : number(n), name(na), price(p) {};
    void info() const;
private:
    string name;
    int number, price;
};

Функция-член выглядит следующим образом:

void Product::info() const {
    cout << number << ". " << name << " " price << endl;
}

Затем я создаю вектор и добавляю в него некоторые объекты, например:

vector<Product> range;
range.push_back(Product(1, "Bagpipe", 25));

Чтобы получить и вывести информацию обо всех объектах, у меня есть следующая функция:

void listProducts (const vector<Product>& range1) {
    for_each (range1.begin(), range1.end(), mem_fun_ref(&Product::info));
}

Но вот где я застреваю.

Чтобы свести мою проблему: Я понятия не имею, как извлечь отдельные объекты из вектора и отредактировать их. Мне нужно иметь возможность искать в моем векторе объекты, содержащие определенное число или имя, и иметь возможность извлекать либо информацию обо всех его закрытых членах, а также иметь возможность редактировать всех членов.

Таким образом, у меня есть идеи относительно решений:

  • для создания дополнительных функций-членов которые могут вернуть отдельные члены

  • для создания функций, которые, подобно функции, которую я уже описал выше, могут выполнять поиск по каждому объекту в векторе и использовать возврат этих дополнительных функций-членов для сравнения с тем, что я ищу

  • Я не совсем знаю, как мне отредактировать закрытые элементы объектов, но мое текущее предположение состоит в том, что для этого мне понадобятся и функции-члены, и функции, связанные с этими

Любая помощь будет принята с благодарностью! Даже смутные толчки в правильном направлении!

Ответы [ 4 ]

2 голосов
/ 29 апреля 2011

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

  • Измените их на public.
  • Добавление функции доступа к классу (т. Е. int MyClass::getFoo() const и void MyClass::setFoo(int)).
  • Сделайте вашу функцию классом friend.

Это не имеет ничего общего с хранением в vector.

1 голос
/ 29 апреля 2011

Вы можете использовать std:find_if для поиска элементов в векторе на основе любых критериев, которые вы пожелаете.

Затем вы можете добавить общедоступный интерфейс к Product, чтобы позволить вам обновлять его состояние по мере необходимости. Обратите внимание, что этот интерфейс не должен быть прямым отображением «установить этот элемент на это значение».

0 голосов
/ 29 апреля 2011

Вам необходимо либо предоставить функции-члены для вашего класса Product, которые позволяют изменять свойства Product, либо ЛУЧШЕ заменить объект Product в векторе результатами редактирования существующего, но для этого вам необходимо предоставить функции доступа.или подходящие конструкторы в вашем классе Product.

0 голосов
/ 29 апреля 2011

Boost.MultiIndex с индексом для каждого доступного для поиска поля может быть проще, чем использование vector с вашим собственным поисковым кодом.

Мультииндексные контейнеры Boost Библиотека предоставляет шаблон класса с именем multi_index_container, который позволяет строить контейнеры поддержание одного или нескольких индексов с различная сортировка и доступ семантика. Индексы предоставляют интерфейсы похожи на контейнеры STL, делая их знакомыми. Концепция мультииндексирования над та же коллекция элементов заимствовано из реляционной базы данных терминология и позволяет уточнение сложных данных структуры в духе умножения индексированные реляционные таблицы, где просто наборов и карт недостаточно. Широкий обеспечен выбор показателей, по образцу аналогичных контейнеров STL как std :: set, std :: list и хэшированный наборы.

Я также повторяю комментарии о доступе частного члена в других ответах.

...