【问题标题】: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 多年的代码使用它们)

标签: c++ arrays


【解决方案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 函数。一旦大小达到容量,您需要重新分配所有元素的内存副本,然后删除旧内存。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-12
        • 1970-01-01
        • 2012-10-29
        • 2020-07-19
        • 2021-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多