2

For example, I have a class called Apple and another class called Basket and I want the class Basket to have a private attribute that is an array of Apple objects.

My code:

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

5 回答 5

6

您可以这样做,这会在创建 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类,你可以看看这个

于 2013-06-09T14:07:42.527 回答
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);}
};

另一种方法是创建一个vectorof Apples。

于 2013-06-09T14:07:14.857 回答
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);}
};
于 2013-06-09T14:08:29.160 回答
0

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

对于具有复杂行为的大型对象,使用 std::vector< Apple *> 可能会更好,但如果 std::vector< Apple > 只是一个内部包含一些数据的结构,则可以。

于 2013-06-09T15:12:13.037 回答
0

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

于 2013-06-09T14:07:32.277 回答