我从class 声明了一个对象,并尝试只为该对象设置一个变量,为什么它说它没有声明类型?

After I declare an object from a class, and try to set a variable to that object inly, why does it say that it does not declare a type?

我正在为一个学校项目编写代码,该项目将用于具有安全性的 Chromebook 充电站。我现在遇到的问题是,当我在为用户分配一个 Chromebook 后检测它是否真的在插槽中时,我正在使用摇臂开关来模拟这个,但是当我将引脚声明为摇臂时,arduino verfier想出那个 “'slot1' 没有命名类型”。 代码如下:

    //class
     class Chromebook_slot {
      public:
        String Name = "";
        String RFID_tag = "";
        int rocker = 0;
        boolean chromebook_in = false;
    //class function to check if chromebook is in.
    //if not, redirect already to reassigning so chromebook slot is entered as open and free.
       void set_if_in()
       {
         int momen_1_state = digitalRead(momen_1);
         int momen_2_state = digitalRead(momen_2);

         // the button has been pushed down and the previous process has been completed
         // eg. servos would have been reset if there was a previous user
         if (momen_1_state == HIGH || momen_2_state == HIGH)
         {
           chromebook_in = digitalRead(this->rocker);
          if (chromebook_in == 0)
           {
            re_assigning();
           }

          else
          {
            return;
           }
         }

       }
    };


    //this is now outside the class..

    //class declarations
    Chromebook_slot slot1;
    Chromebook_slot slot2;

    //variables for rocker switches which will act for detecting chromebooks.
    // in my final version, this will replaced by a photoresistor and laser.

    slot1.rocker = 3;
    slot2.rocker = 2;

其中函数 re_assigning() 是在代码中进一步声明的单独函数,只是将插槽重置为打开以供将来使用。

slot1.rocker = 3;
slot2.rocker = 2;

这些语句不能位于 C++(或 .ino)文件的顶层。它们需要在函数内部。正在发生的事情是编译器正在通过潜在有效结构的镜头查看 slot1 标识符。它看到一个标识符,并且此时在以标识符开头的代码中唯一可以合法存在的是一些声明,例如int a = 7;,或者更抽象地说 some_type some_more_stuff。所以它期望 slot1 是一种类型,但它不是,因此是消息。

如果您希望在 Arduino 程序的早期进行此类作业,您可以做的最简单的事情就是将它们放入 setup():

void setup() {
  slot1.rocker = 3;
  slot2.rocker = 2;
  // ...
}

或者,您可以将这些作为 Chromebook_slot 的构造函数的一部分,这样它们就可以在 slot1slot2 的声明中给出:

class Chromebook_slot {
public:
    Chromebook_slot(int rocker_init_value) {
      rocker = rocker_init_value;
    }
// ...    

或者以一种可能不太熟悉但更合适的形式,使用构造函数的初始化列表:

class Chromebook_slot {
public:
    Chromebook_slot(int rocker_init_value) 
     : rocker(rocker_init_value) {}
// ...    

一旦你有了 Chromebook_slot 的构造函数,你的变量就可以变成:

Chromebook_slot slot1(3);
Chromebook_slot slot2(2);