Как легко создать вектор или массив в классе и как получить к ним доступ

0

Например, vector<double> A(5); может вернуть нам вектор из 5 элементов. Можно ли сделать что-то подобное в class который мы строим сами?

Например, у меня есть класс под названием Fruit. Какой конструктор я должен написать так, что Fruit A(5); может вернуть мне 5 apples. Это означает, что apples являются частным членом этого класса и должны быть массивом или вектором размером 5. Причина, по которой я не писал детали apples заключается в том, что я не знаю, как правильно объявить ее в члене и создать это конструктор.

В конце концов, после создания Fruit A(5); , могу ли я получить доступ только к члену этого массива, создав функцию get() в классе, или есть более удобный способ сделать это?

Очень ценю, если вы можете дать мне несколько советов. Благодарю!

Теги:
class
constructor

3 ответа

3

Вы хотите хранить apples в vector или array. Затем вы хотите переопределить [] operator чтобы получить доступ к нужной вещи. Итак, что-то вроде:

class Fruit
{
  private:
    vector<apple> apple_storage;
  public:
    int& operator[](int j) {return apple_storage[j];}
};

Затем вы можете легко использовать A[3] для доступа к вашему apple_storage.

  • 0
    Блин, переопределение оператора, как я мог забыть! Чувак, большое спасибо. Это очень полезно!
2

Простейшая стратегия заключалась бы в том, чтобы ваш класс включал контейнер. Сделайте его общедоступным, если вы не хотите писать для него аксессоры:

class Fruit
{
  public:
    Fruit() { } 
    Fruit(int asize) : basket_(asize) { } 

    vector<apple> basket_ ; 
} ;

Затем вы создадите его:

Fruit A(5) ;

// get an apple from Fruit
apple tmpapple= A.basket_[1] ;
  • 0
    Argh! Честно говоря, они оба плохой совет. std::vector нет виртуального деструктора, поэтому наследование от std::vector - плохая идея. Если apples нельзя манипулировать вне класса, заключите их в капсулу, не подвергайте их воздействию!
  • 0
    Спасибо за ответ, но я не уверен, как именно это работает. Например, что означает C (размер), когда мы даже не определили C? Не слишком знаком с наследованием
Показать ещё 7 комментариев
0

Без особых подробностей в apple и при условии, что у них есть конструктор по умолчанию, здесь наивный способ.

class Fruits {
public:
    typedef std::vector<apple> AppleArray;
    typedef AppleArray::iterator AppleIterator;
    typedef AppleArray::const_iterator AppleConstIterator;

    Fruits(int appleCount)
        : mApples(appleCount)
    {
    }

    ~Fruits()
    {
    }

    apple& getAppleAt(size_t index)
    {
        return mApples.at(index);
    }

    const apple& getAppleAt(size_t index) const
    {
        return mApples.at(index);
    }

    AppleIterator getAppleBegin()
    {
        return mApples.begin();
    }

    AppleIterator getAppleEnd()
    {
        return mApples.end();
    }

    AppleConstIterator getAppleBegin() const
    {
        return mApples.begin();
    }

    AppleConstIterator getAppleEnd() const
    {
        return mApples.end();
    }

    size_t getAppleCount() const
    {
        return mApples.size();
    }    
private:
    std::vector<apple> mApples;
};

Я предполагаю, что это не производственный код, а для чисто обучения C++. Если бы вы планировали подобную вещь в реальной жизни, вам нужно будет подумать, что Apple является Fruit и Fruits, больше похожа на коллекцию, в которой есть один или несколько плодов, из которых один - это Apple. В этом случае ваши Fruits будут больше похожи на Fruits std::vector<Fruit*> fruits; а затем вы используете цикл для инициализации количества Apple вы хотите в этом списке fruits.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню