使用 C++ 的 Array 中的非静态成员引用错误

Posted

技术标签:

【中文标题】使用 C++ 的 Array 中的非静态成员引用错误【英文标题】:A nonstatic member reference error in Array using c++ 【发布时间】:2019-05-02 07:55:57 【问题描述】:

我是 C++ 编程的初学者,我现在正在学习所有关于类和对象的知识。为了练习,我创建了一个名为 Employee 的类,并在其中添加了一些成员。但我注意到记录数组给了我一个错误,指出非静态成员引用必须相对于特定对象。这只发生在我在 Employee 类中创建数组时。但是当我在构造函数Employee() 中调用它时,它并没有突出显示为错误,以及当我尝试将它初始化为全局变量,甚至是我的main.cpp 中的局部变量时(这是main()位于)。请为此提供建议甚至更好的解决方案。

   #pragma once
   #include<string>
   #include<iostream>
   using namespace std;

   class Employee
   
   private:
   int recordSize = 100;
   int fieldSize = 4;
   string record[recordSize][fieldSize];

   public:
   Employee();
   ~Employee();

   ;

main.cpp:

   #include "Employee.h"
   #include<string>
   #include<iostream>
   #include<iomanip>
   #include<fstream>
   using namespace std;

   Employee::Employee() 
      ifstream inFile;
      inFile.open("C:\\Users\\RJ\\Desktop\\employee-info.txt");

      for (int index = 0; index < recordSize; index++) 
          for (int index2 = 0; index2 < fieldSize; index2++) 
             inFile >> record[recordSize][fieldSize];
             
           
          

   Employee::~Employee()
   
   

我还包括employee-info.txt的内容

 ID           Firstname            Lastname                 Sales
 1                Bruno                Mars             120000.00
 2               Lebron               James             150000.00

【问题讨论】:

using namespace std; - 从不在头文件中。 – C:\\Users\\RJ\\Desktop\\employee-info.txt – 内容? string record[recordSize][fieldSize]; -- 这不是有效的 C++。如果您这样做,也会出现同样的错误:int main() int recordSize = 100; std::string record[recordSize];, 那么您的数组是固定大小的,还是在运行时它们的大小会有所不同?答案取决于您的意图。 您需要阅读您最喜欢的 C++ 书籍中有关数组的更多信息。 你想用你的代码实现什么?字符串数组? inFile &gt;&gt; record[recordSize][fieldSize]; 应该是inFile &gt;&gt; record[index][index2]; 【参考方案1】:

变量recordSizefieldSize 需要同时是staticconst(或constexpr)才能用作std::string record 二维数组的维度。

它们必须是const,因为数组绑定应该是一个整数常量。

它们必须是static,因为record 数组不允许对于Employee 类的不同实例具有不同的大小。

如果您希望 2D 数组能够在 Employee 类的不同实例中保存不同的大小,则应改为使用 std::vectorstd::vector&lt;std::string&gt;

【讨论】:

这个回答了我的问题。很棒的信息和建议。我还需要多练习。任重而道远。 事实上,我总是建议先使用std::vector 首先,然后如果你发现有必要考虑更改为std::array 或原始数组.您当然想要一个 std::vector 记录;对于每个单独的记录,您可能更喜欢结构/类。【参考方案2】:

用于定义数组大小时,大小需要为constexpr

static constexpr int recordSize = 100;
static constexpr int fieldSize = 4;
string record[recordSize][fieldSize];

【讨论】:

以上是关于使用 C++ 的 Array 中的非静态成员引用错误的主要内容,如果未能解决你的问题,请参考以下文章

访问静态成员函数中的非静态成员的解决方法

指向任何类类型的非静态成员函数的 C++ 函数指针

c++ 使用引用另一个类的类的非成员函数

C++中得sort函数的比较函数(第三个参数)为什么要声明为static

MFC中静态成员函数调用其他类的非静态变量

从嵌套类的函数访问父级的非静态成员