Например, vector<double> A(5);
может вернуть нам вектор из 5 элементов. Можно ли сделать что-то подобное в class
который мы строим сами?
Например, у меня есть класс под названием Fruit. Какой конструктор я должен написать так, что Fruit A(5);
может вернуть мне 5 apples
. Это означает, что apples
являются частным членом этого класса и должны быть массивом или вектором размером 5. Причина, по которой я не писал детали apples
заключается в том, что я не знаю, как правильно объявить ее в члене и создать это конструктор.
В конце концов, после создания Fruit A(5);
, могу ли я получить доступ только к члену этого массива, создав функцию get()
в классе, или есть более удобный способ сделать это?
Очень ценю, если вы можете дать мне несколько советов. Благодарю!
Вы хотите хранить apples
в vector
или array
. Затем вы хотите переопределить [] operator
чтобы получить доступ к нужной вещи. Итак, что-то вроде:
class Fruit
{
private:
vector<apple> apple_storage;
public:
int& operator[](int j) {return apple_storage[j];}
};
Затем вы можете легко использовать A[3]
для доступа к вашему apple_storage
.
Простейшая стратегия заключалась бы в том, чтобы ваш класс включал контейнер. Сделайте его общедоступным, если вы не хотите писать для него аксессоры:
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] ;
std::vector
нет виртуального деструктора, поэтому наследование от std::vector
- плохая идея. Если apples
нельзя манипулировать вне класса, заключите их в капсулу, не подвергайте их воздействию!
Без особых подробностей в 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
.