【问题标题】:why use "static" keyword before public data member?为什么在公共数据成员之前使用“静态”关键字?
【发布时间】:2019-06-05 14:59:49
【问题描述】:

我在班级的公共部分有一个名为“students”的整数数据成员,并在构造函数中用作参数。 成绩册.h:

class gradebook
{
public:
    int students = 10;
    gradebook(string, int[]);
    void SetCourseName(string _coursename);
    ...
private:
    string coursename;
    ...
};

成绩簿.cpp:

#include "gradebook.h"

gradebook::gradebook(string s1, int array[students])
{
    SetCourseName(s1);
}
void gradebook::SetCourseName(string _coursename)
{
    coursename = _coursename;
}

当我尝试编译代码时收到此错误:

invalid use of non-static data member 'gradebook::students'
gradebook::gradebook(string s1, int array[students])
                                          ^

如果我将 'static const' 放在 'int student = 10' 之前,问题就会消失。

为什么?

【问题讨论】:

  • 你需要使用 std::vector 来代替。

标签: c++


【解决方案1】:

这个表达式定义了一个固定长度的堆栈分配数组。数组的长度必须在编译时知道:

int array[students]

添加 static 关键字将数组的长度内联为编译时常量。

要像您的示例中那样允许类内初始化,您实际上需要定义变量 const 和 static,如下所示:

static const int students = 10;

您可以在此处http://www.cplusplus.com/doc/tutorial/arrays/找到有关数组的一些详细信息

加法:传递一个固定长度的数组作为参数会导致传递一个指针,长度被忽略。因此,您可以简单地省略传递数组的“长度”,并将您的类内变量用作迭代数组的常量。

【讨论】:

  • 这会产生一个代码,就好像我们在写int array[]int * array。但在语法上,该变量用于初始化一定长度的数组。在现代 C++ 中,没有什么可以阻止您在类定义中初始化非静态整数变量。只是在这种特定的情况下,它是行不通的。
猜你喜欢
  • 1970-01-01
  • 2015-02-10
  • 1970-01-01
  • 2012-03-28
  • 2020-11-15
  • 2011-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多