当参数为类C 时,用函数更改数组

Changing array with function when parameter is class type c++

本文关键字:函数 数组 参数      更新时间:2023-10-16

我知道这可能是这样的重复:在C中更改内部功能的数组,但是我彻底阅读了它,我想知道一种情况:

void addCustomer(Customer*** array, int length, char type) {
    for (int i = 0; i < length; i++) {
    Customer *c1 = new Customer();
    switch (type) {
    case '1':
        c1 = new LowCustomer();
        break;
    case '2':
        c1 = new MiddleCustsomer();
        break;
    case '3':
        c1 = new HighCustomer();
        break;
    case '4':
        c1 = new VIPCustomer();
        break;
    }
    (*array)[i] = c1;
}

LowCustomerMiddelCustomerHighCustomerVIPCustomer类均来自Customer类。

因此,正如我必须使用new关键字一样,现在的数组必须为***。有没有更好的办法?因为我的代码继续在C1上使用0xcdcdcdcd产生运行时错误。

我在main中的代码看起来像:

Customer*** low = new Customer**[10];
addCustomer(low, 10, 'c');

P.S。哦!顺便说一句,我知道使用vector会使它变得更容易,但是我真的想为此使用指针。

Customer*** low = new Customer**[10];

这仅创建10 Customer**的数组。这些是非直接的指针。在(*array)[i] = c1;中,您是在删除这些不可分化的指针,这是不确定的行为,会让您看到您看到的运行时错误(如果幸运的话)。

您也在这里大量泄漏内存。如果您new,则必须最终delete。但是Customer *c1 = new Customer();没有相应的delete,您只是覆盖(或试图)该指针以后。

如果您真的想坚持使用指针,这基本上会起作用(使用Customer*数组的引用):

Customer** low = new Customer*[10];
addCustomer(low, 10, 'c');
// ...
void addCustomer(Customer**& array, int length, char type)
{
  for (int i = 0; i < length; i++)
  {
    Customer* c1;
    switch (type) {
    case '1':
        c1 = new LowCustomer();
        break;
    case '2':
        c1 = new MiddleCustsomer();
        break;
    case '3':
        c1 = new HighCustomer();
        break;
    case '4':
        c1 = new VIPCustomer();
        break;
    default:
        // Error handling...
  }
  array[i] = c1;
}

您也可以坚持三星级的方法,但是low必须是Customer**,然后将指针传递到低点到addCustomeraddCustomer(&low, 10, 'c');

不必说,使用向量。不可能通过查看函数签名来说明只有中间*应该是一个数组。

我明确忽略了您对std::vector的评论,因为我没有看到您避免这种情况的充分理由。 std::vector很好地管理了分配的内存的内存。通过将std::unique_ptr存储到其中,您还可以为创建的实例提供正确的内存管理。

其他一些更改包括:

  • 按值返回而不是输出参数
  • 保留向量,以获取向量的单个内存分配
  • 使用size_t而不是int以使大小匹配vector的size_type

建议的更改:

  • 用范围的枚举(枚举类)替换'char'

编译器资源管理器上的代码

#include <vector>
#include <memory>
struct Customer
{
    virtual ~Customer() = default;
};
struct LowCustomer : Customer {};
struct MiddleCustomer : Customer {};
struct HighCustomer : Customer {};
struct VIPCustomer : Customer {};
using Customers = std::vector<std::unique_ptr<Customer>>;
Customers createCustomer(size_t length, char type)
{
    auto values = Customers{};
    values.reserve(length);
    for (size_t i = 0; i < length; i++)
    {
        switch (type)
        {
        case '1':
            values.emplace_back(std::make_unique<LowCustomer>());
            break;
        case '2':
            values.emplace_back(std::make_unique<MiddleCustomer>());
            break;
        case '3':
            values.emplace_back(std::make_unique<HighCustomer>());
            break;
        case '4':
            values.emplace_back(std::make_unique<LowCustomer>());
            break;
        default:
            values.emplace_back(std::make_unique<Customer>());
            break;// Error handling...
        }
    }
    return values;
}
int main(int, char**)
{
    auto low = createCustomer(10, 'c');
}