2013-06-09 3 views
2

Например, у меня есть класс под названием Apple и другой класс, называемый Basket, и я хочу, чтобы класс Basket имел частный атрибут, являющийся массивом объектов Apple.В C++ возможно ли для класса иметь массив, содержащий объекты другого класса?

Мой код:

basket.h

#include <iostream> 
#include <string> 
#include <apple.h> 

// defin basket 
class Basket { 
    //class attrs; private 
    private: 
     std::string name; 
     // I want Basket objects to have an array of Apple objects 
     // How do I do this? 
     Apple []; 
    public: //class function 
     Basket(std::string); //constructor 
     std::string get_name() {return (name);} 
}; 

apple.h

#include <iostream> 
#include <string> 

// defin apple 
class Apple { 
    //class attrs; private 
    private: 
     std::string name; 
    public: //class function 
     Apple(std::string); //constructor 
     std::string get_name() {return (name);} 
}; 
+2

попробуйте 'std :: vector ' member –

+2

Просто предложение: если вы не знаете, как объявить массив, как его использовать, какова его семантика и различные способы поведения, которые будут отличаться от того, что вы ожидаете (особенно, когда вы передаете его в качестве параламента), вы должны узнать это прежде, чем заниматься классами.Кроме того, как упоминалось в предыдущем комментарии, вам лучше использовать std :: vector вместо массива. –

ответ

5

Вы можете сделать это, это создает массив из 50 яблок сразу после создания экземпляра корзины. Если вы не хотите, чтобы вместо этого вы могли использовать std::vector<Apple>, который является динамическим массивом.

Первый метод:

class Basket { 
    //class attrs; private 
    private: 
     std::string name; 
     // I want Basket objects to have an array of Apple objects 
     // How do I do this? 
     Apple apples[50]; 
    public: //class function 
     Basket(std::string); //constructor 
     std::string get_name() {return (name);} 
}; 

Второй метод:

class Basket { 
    //class attrs; private 
    private: 
     std::string name; 
     // I want Basket objects to have an array of Apple objects 
     // How do I do this? 
     std::vector<Apple> apples; 
    public: //class function 
     Basket(std::string); //constructor 
     std::string get_name() {return (name);} 
}; 

Если вы не знаете, как использовать vector класс, вы можете проверить this аут.

+0

Нет Apple(). – UldisK

3

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

Apple fruit[10]; 

в разрешить максиму из 10 яблок в корзине. Таким образом, ваша Basket декларация будет выглядеть следующим образом:

// define basket 
class Basket { 
    //class attrs; private 
    private: 
     std::string name; 
     // I want Basket objects to have an array of Apple objects 
     // How do I do this? 
     Apple fruit [10]; 
    public: //class function 
     Basket(std::string); //constructor 
     std::string get_name() {return (name);} 
}; 

Другой путь будет создать vector из Apple с.

0

Если конструктор класса Apple не имеет аргументов, вы можете определить матрицу apple в качестве члена в классе Basket. В противном случае вы не можете, потому что у вас нет возможности инициализировать элементы массива.

+0

Это не относится к C++ 11. – juanchopanza

3

Да, но вы должны указать размер, поскольку вы не можете использовать массив с неопределенным размером во время компиляции.

#include <iostream> 
#include <string> 
#include "apple.h" // Don't use <> for your own headers. 

class Basket { 
    private: 
     static const int MAX_APPLES = 10; 

     std::string name; 
     Apple apples[MAX_APPLES]; 
    public: 
     Basket(std::string); 
     std::string get_name() {return (name);} 
}; 

В качестве альтернативы, можно использовать контейнер, который изменяет размер динамически, такие как std::vector:

#include <iostream> 
#include <string> 
#include <vector> 
#include "apple.h" 

class Basket { 
    private: 
     std::string name; 
     std::vector<Apple> apples; 
    public: 
     Basket(std::string); 
     std::string get_name() {return (name);} 
}; 
0

Вы можете использовать станд :: вектор < Яблоко>, но нужно учитывать, что зЬй :: вектор может вызвать конструкторы объектов и деструктор за кулисами (например, когда вы вызываете resize()). Это может привести к тому, что ваши объекты будут делать то, чего вы не ожидали (например, удалите кусок памяти и оставьте сломанный указатель).

Для больших объектов со сложным поведением лучше использовать std :: vector < Apple *>, но std :: vector < Apple> будет нормально, если это просто структура с некоторыми данными внутри.

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