无法制作长度未指定的数组

Posted

技术标签:

【中文标题】无法制作长度未指定的数组【英文标题】:Can't make arrays with unspecified length 【发布时间】:2019-10-22 19:27:49 【问题描述】:

基本上,我正在尝试创建一个数组,每次用户输入一个值时该数组都会变大。这意味着我永远不知道阵列会有多长时间。我不知道这是否与我的班级或其他任何事情有关。

#pragma once
#include <iostream>
#include <string>
#define dexport __declspec(dllexport)
//Im making an DLL
using namespace std;
class dexport API 
private:
    string users[] = "CatMan","ManCat"; //Line With Error Incomplete Type Is Not Allowed
public:
    string getAllUsers(string list[]) 
        for (unsigned int a = 0; a < sizeof(list) / sizeof(list[0]); a = a + 1) 
            return list[a];
        
    
;

它给了我一个错误 Incomplete type is not allowed。我真的不知道该怎么办。 Compiler Error

【问题讨论】:

你想要的是std::vector 顺便说一句,getAllUsers 只返回第一个元素。 你有共识。但是如果你不允许使用容器库,总是有newdelete (它们在很大程度上被std::vector 之类的容器所取代,但是有20 多年的代码使用它们) Create an array when the size is a variable not a constant的可能重复 【参考方案1】:

您的代码有一些问题。对于初学者来说,数组的大小是固定的,因此,即使您的代码编译成功,它也不会工作。通常,编译器会从初始化器的长度推断出数组的大小;但是您正在创建一个类,它需要知道它,因此会出现错误。

这将解决您的编译问题:

string users[2] = "CatMan","ManCat";

但是你的数组有一个固定的大小,这不是你想要的,所以你需要一个std::vector:

#include <vector>

[...]

vector<string>users = "CatMan","ManCat";

现在您可以使用 '[]' 运算符来访问字符串,并使用 users.push_back 添加新用户。

您需要解决的下一个问题是您尝试返回值的方式:您不应该将参数用作输出值(尽管您可以使用引用或指针)。您应该决定是要返回对向量的引用、向量的副本还是 const 引用,例如:

// Returning a copy
vector<string> getAllUsers() 
    return users;


// Returning a reference
vector<string>& getAllUsers() 
    return users;

最后,您正在创建一个库:您应该知道,如果要在不同进程之间共享内存,则需要使用某种共享内存。目前,每个程序都会保留自己的 API 副本。

【讨论】:

【参考方案2】:

您正在寻找的是std::vector

您可以找到更多信息here.

它有点类似于数组,只是它允许可变长度。

【讨论】:

【参考方案3】:

您可以使用 std::vector。如果空间不足,它会将元素分配并复制到新位置。

如果您出于教育原因想自己上课,这是您应该尝试的基本解决方案:

您预先分配一些内存并将其长度存储为容量。您需要一个变量(大小)来存储已经输入到类中的元素数量,例如通过 push_back 函数。一旦大小达到容量,您需要重新分配所有元素的内存副本,然后删除旧内存。

【讨论】:

以上是关于无法制作长度未指定的数组的主要内容,如果未能解决你的问题,请参考以下文章

Fortran数组范围检查的运行时检查未触发

无法读取未定义猫鼬的属性“长度”

无法安装 UWP 应用:未指定的错误

用数据填充未指定大小的数组

动态数组获取“错误代码未指定启动失败”

LogicException 错误:传递的数组未指定现有的静态方法