【问题标题】:Declaring a variable size array/vector inside a C++ class [duplicate]在 C++ 类中声明可变大小的数组/向量 [重复]
【发布时间】:2021-09-18 21:29:18
【问题描述】:

我想在 C++ 类中声明一个可变大小(不是真正的可变大小)数组/向量,但遇到了奇怪的错误。我试图找到解决方案,但无法解决错误。 C++ 大神们,保佑我。

class threeStack{
    private:
        int numberOfStacks = 3;
        int sizeOfEachStack = 2;
        int kc = 10;
        vector <int> a(numberOfStacks * sizeOfEachStack);
        vector <int> tops(numberOfStacks);
        };

错误

         vector <int> a(numberOfStacks * sizeOfEachStack);
                        ^~~~~~~~~~~~~~
main.cpp:10:27: error: ‘numberOfStacks’ is not a type
         vector <int> tops(numberOfStacks);
                           ^~~~~~~~~~~~~~

【问题讨论】:

  • 不要包含我们不需要阅读的代码。见minimal reproducible example
  • @463035818_is_not_a_number - 好的,知道了
  • 为什么你认为你可以做到vector&lt;int&gt; a(n);?哪个book 说你可以?
  • @Evg 如果我在vector &lt;int&gt; a(n); 之前定义了 n,我绝对可以使用它。
  • @Anant 在函数体中,而不是在类定义中。见here

标签: c++ arrays class oop


【解决方案1】:

这是一个函数的声明:

vector <int> tops(numberOfStacks);
|            |   ||
|            |   |type of first parameter
|            |   parameter list
|            name of the function
return type

您不能将此语法用于默认成员初始化程序。

【讨论】:

  • 你能推荐一些我可以阅读的东西来学习这些东西吗?至少是基础知识,不过我目前正在阅读“加速 C++”。
  • @Anant 有一个书籍列表here。我自己不能保证任何特定的书。我唯一的 C++ 书是 Bjarne 的 C++ 编程语言的旧版本。
  • "另外,您不能在默认成员初始化程序中引用其他成员。"我觉得你可以? coliru.stacked-crooked.com/a/2824f8cf7a4ff0c6
  • @phön 我想我只是假设¯\_(ツ)_/¯
  • @eerorika¯\_(ツ)_/¯
【解决方案2】:

在声明类成员时,您不指定构造函数参数。这是在类本身的构造函数中完成的。

class threeStack{
    private:
        int numberOfStacks;
        int sizeOfEachStack;
        int kc;
        vector <int> a;
        vector <int> tops;

    public:
        threeStack() : numberOfStacks(3), sizeOfEachStack(2), 
                       kc(10), a(3 * 2), tops(3) {
        }

        threeStack(int numberOfStacks, int sizeOfEachStack) : 
            numberOfStacks(numberOfStacks),
            sizeOfEachStack(sizeOfEachStack),
            kc(10), 
            a(numberOfStacks * sizeOfEachStack), 
            tops(sizeOfEachStack) 
        {
        }
};

此外,数据成员的默认初始化是 C++11 及更高版本的一项功能,因此如果您使用旧版本的标准进行编译,您还需要在构造函数中指定这些。

【讨论】:

  • "在声明类成员时,您不能指定构造函数参数,也不能指定默认值。"当然可以。它被称为默认成员初始化器
猜你喜欢
  • 2021-01-08
  • 1970-01-01
  • 2012-03-12
  • 1970-01-01
  • 2012-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-21
相关资源
最近更新 更多