当参数为类C 时,用函数更改数组
Changing array with function when parameter is class type c++
我知道这可能是这样的重复:在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;
}
LowCustomer
,MiddelCustomer
,HighCustomer
和VIPCustomer
类均来自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**
,然后将指针传递到低点到addCustomer
:addCustomer(&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');
}
- 第 i 个元素返回 i 的函数数组
- 使用嵌套函数数组是个好主意吗?
- 正确实现类函数数组
- 试图引用已删除函数数组的相等运算符
- 如何在静态函数中使用成员函数数组
- 无法创建函数数组
- 构造函数数组
- 使用开关或定义函数数组 - 更快
- 编写一个函数,该函数将覆盖主函数数组中的值
- 可以像'funs[1]();'一样调用的函数数组
- std::AVX内部函数数组
- 如果数组大小未知,如何将函数数组作为参数传递
- 从函数数组中获取值
- 使用元编程在编译时初始化函数数组
- 将C函数数组转换为C++函数指针数组
- 复制构造函数 [数组] C++
- 添加函数数组并随机选择其中一个
- 指针到私有成员函数数组
- 可以单独声明函数数组的元素
- (c++)将main中的随机值保存到函数数组中