容器类与类 - C ++

时间:2016-09-19 19:47:14

标签: c++ class

我是编程新手,只是遇到了这个任务

  

创建一个包含20个人对象数组的容器类系列。

我一直在网上和我的书中看,但我仍然无法弄清楚容器类和C ++中的类之间的区别。

我怎样才能同时创建一个家庭类和20个人对象?

3 个答案:

答案 0 :(得分:9)

“集装箱舱”不是一些官方用语;它只是单词“class”,旁边有英文描述单词。作业要求你创建一个包含其他东西的类;即一组20 person个对象。

最基本的,结果可能就像这样简单:

class family
{
public:
   person people[20];
};

在现实生活中,你可能会做这样的事情:

#include <array>
using family = std::array<person, 20>;

似乎不太可能每个家庭(甚至大多数家庭)都有20个人,所以我个人最终会选择:

#include <vector>
std::vector<person> family;

......并根据需要操纵矢量。

答案 1 :(得分:2)

C ++是一种面向对象的语言,鼓励您“封装”。第一步是将概念分组为根据数据值描述的对象以及可以对该数据执行的操作。

因此,可以定义一个由{id}和余额组成的Account类以及存入或取出货币的函数。这个定义形成类型,但当你“实例化”(创建一个这样的实例)时,即

Account a;

然后变量a引用此范围内类型帐户对象

有时您需要一个可以存储和跟踪其他类型对象的类。这有时被称为“容器类”,通常它将商店和计数结合起来。

假设我们要存储一些float。我们可以写:

float store[64];

std::cout << "Enter the first number: ";
std::cin >> store[0];

但我们如何追踪我们有多少花车?我们可能需要一个柜台。

float store[64];
int stored = 0;

std::cout << "Enter the first number: ";
std::cin >> store[0];
stored++;

std::cout << "Enter the second number: ";
std::cin >> store[1];
stored++;

这是有效的,而且并不是非常困难,但是如果你正在编写一个期望带商店和它的尺寸的功能,你怎么表达呢?

void myFunction(std::string label, float* store, int count);

这需要两个参数,而且不完全明确。

C ++是关于封装的:这个带有内容计数的“存储”的想法可以封装到一个类中:

struct Store {
    float store_[64] {};
    int count_ {0};
};

这是容器。我们现在可以编写一个函数,该函数使用一个参数获取包含其他值的对象:

void myFunction(std::string label, Store& store);  // & here = by reference

如果这是'C',你会编写直接操作商店中值的代码:

store.store_[N] = 1;
store.count_++;
但是那很麻烦,我们没有检查是否有空间。在C ++中,我们可以使用成员函数将其封装到类描述中,并隐藏成员变量,以便 通过我们的被禁界面来操作数据。

#include <iostream>

class Store {
    enum { MaxCount = 64 };
    float store_[MaxCount] {};
    size_t count_ = 0;
public:
    // return the maximum number of elements we can store
    size_t capacity() const { return MaxCount; }
    // true/false: is the store empty?
    bool empty() const { return count_ == 0; }
    // return the current count
    size_t size() const { return count_; }

    bool add(float value) {
        if (count_ >= capacity()) {
            std::cerr << "store is full!\n";
            return false;
        }
        store_[count_] = value;
        ++count_;
    }
    // reset
    void clear() {
        count_ = 0;  // we don't actually need to change the store
    }
    // allow array-like usage
    const float& operator[](size_t index) const { return store_[index]; }
    float& operator[](size_t index) { return store_[index]; }
    // provide bounds-checked array-ish access
    float at(size_t index) const {
        if (index >= count_)
            throw std::invalid_argument("array index out of bounds");
        return store_[index];
    }
};

int main() {
    Store store;
    for (size_t i = 0; i < store.capacity(); ++i) {
        std::cout << "Enter number #" << i << " or -ve to stop: " << std::flush;
        float f = -1;
        std::cin >> f;
        std::cout << "\n" << f << "\n";
        if (f < 0)
            break;
        store.add(f);
    }
    std::cout << "You entered " << store.size() << " values:";
    for (size_t i = 0; i < store.size(); ++i) {
        std::cout << ' ' << store[i];
    }
    std::cout << '\n';
}

现场演示:http://ideone.com/boE3Ki

答案 2 :(得分:0)

他们告诉您创建一个充当数组容器的类。在编程中,特别是当你第一次启动时,你会看到许多称为容器的元素,因为你的老师希望你将变量,类和数组(以及其他编程工具)视为容器,以便存储数据。

以这种方式查看编程使得在进入更复杂的想法(如指针)时更容易概念化信息。

所以,很久以来,请在其中创建一个包含数组的类。如果您正在学习构造函数和重载,请确保根据传入的数据对其进行初始化。如果没有,则只需几行代码即可完成项目。