在c ++中,一个类是否有可能拥有一个包含另一个类的对象的数组?

时间:2013-06-09 14:02:22

标签: c++ oop object

例如,我有一个名为Apple的类和另一个名为Basket的类,我希望类Basket具有一个属性为Apple对象的私有属性。

我的代码:

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);}
};

5 个答案:

答案 0 :(得分:5)

你可以这样做,这会在创建Basket实例时立即创建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

答案 1 :(得分:3)

您当然可以使用

在类Basket中创建一个数组
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 s。

答案 2 :(得分: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);}
};

答案 3 :(得分:0)

如果Apple类的构造函数没有参数,那么您可以将apple数组定义为Basket类中的成员。否则你不能,因为你没有办法初始化数组的元素。

答案 4 :(得分:0)

你可以使用std :: vector&lt; Apple&gt;,但您需要考虑std :: vector可能在后台调用对象的构造函数和析构函数(例如,当您调用resize()时)。这可能会导致你的对象做一些你没想到的事情(比如删除一块内存并留下一个破碎的指针)。

对于行为复杂的大型对象,最好使用std :: vector&lt; Apple *&gt;,但是std :: vector&lt; Apple&gt;如果它只是一个包含一些数据的结构,那就没关系。