【问题标题】:Need help struct-void error: type name isn't allowed需要帮助 struct-void 错误:不允许类型名称
【发布时间】:2021-09-22 14:09:42
【问题描述】:

我创建了一个 struct 和 void 函数。我想用 void abc 在 struct xyz 中写出年龄和姓名。但我不明白我在案例 1-2 部分遇到了错误

类型名称不允许

#include <iostream>
using namespace std;

struct xyz {
    int age = 20;
    string name = "name";
};
void abc() {
    int num;
    cin >> num;
    switch (num) {
    case 1: cout << xyz.age << endl;
        return;
    case 2: cout << xyz.name << endl;
        return;
    }
}
int main()
{
    for(;;)
    abc();
}

【问题讨论】:

  • 您必须创建一个xyz实例。它是一种类型,而不是变量。
  • 这能回答你的问题吗? Proper way to initialize C++ structs
  • 哦,我做到了!我只是放了“xyz xyz1;”进入虚空abc。之后更改为 xyz1.age
  • Ruks 感谢这个技巧。我知道我不必在 void 中创建该实例。正如你所说,我做到了 struct xyz { int age = 20;字符串名称=“名称”; }xyz1;

标签: c++


【解决方案1】:

你必须做这样的事情 -

#include <iostream>
using namespace std;

struct xyz {
    int age = 20;
    string name = "name";
};
void abc() {
    xyz myStruct;
    int num;
    cin >> num;
    switch (num) {
    case 1: cout << myStruct.age << endl;
        return;
    case 2: cout << myStruct.name << endl;
        return;
    }
}
int main()
{
    for(;;)
        abc();
}

另一种选择是这样的 -

#include <iostream>
using namespace std;

struct xyz {
    int age;
    string name;
};
void abc() {
    xyz myStruct{20, "name"};
    int num;
    cin >> num;
    switch (num) {
    case 1: cout << myStruct.age << endl;
        return;
    case 2: cout << myStruct.name << endl;
        return;
    }
}
int main()
{
    for(;;)
        abc();
}

【讨论】:

    【解决方案2】:

    您还没有创建您的类型的实例,即 struct xyz,让我们创建一个名为 static_instance 的实例并将您的代码修复为接近您预期的内容

    #include <iostream>
    #include <string>
    
    struct xyz {
        int age = 20;
        std::string name = "name";
    } static_instance;
    
    void abc() {
        int num{};
        std::cin >> num;
        switch (num) {
            case 1:
                std::cout << static_instance.age << "\n";
                break;
            case 2:
                std::cout << static_instance.name << "\n";
                break;
        }
    }
    
    int main() {
        while (true) {
            abc();
        }
    }
    

    请注意,您似乎缺乏 C++ 的许多基本原则,对于第一次改进,函数 abc 应该是成员方法或引用您的结构。也更喜欢“堆栈”或自动存储变量,即静态之前的实例,即全局变量。喜欢

    #include <iostream>
    #include <string>
    
    struct xyz {
        int age = 20;
        std::string name = "name";
    };
    
    void print(const xyz& instance) {
        int num{};
        std::cin >> num;
        switch (num) {
            case 1:
                std::cout << instance.age << "\n";
                break;
            case 2:
                std::cout << instance.name << "\n";
                break;
        }
    }
    
    int main() {
        xyz instance{};
        while (true) {
            print(instance);
        }
    }
    

    【讨论】:

      【解决方案3】:

      你的陈述

      struct xyz {
          int age = 20;
          string name = "name";
      };
      

      定义了一个名为xyz的类型,但它没有定义这个类型的对象。 要定义一个能够保存实际数据的对象,请定义一个 xyz 类型的变量:

      // Definition of the type xyz
      struct xyz {
          int age = 20;
          string name = "name";
      };
      
      void abc() {
          // define a variable myXYZ, representing an object of type xyz:
          xyz myXYZ;
      
          int num;
          cin >> num;
          switch (num) {
          case 1: cout << myXYZ.age << endl;
              return;
          case 2: cout << myXYZ.name << endl;
              return;
          }
      }
      

      【讨论】:

        【解决方案4】:

        既然你用c++ 标记了它,让我们继续把这段代码写成C++。

        因此,访问struct 成员的函数将是一个成员函数(从长远来看,这是设计代码的最安全方法)。我们创建了一个objectfoo,它是xyz的一个instance,并反复调用它的成员函数abc来获取输入并打印出相应的输出。

        注意,因为abc是一个成员函数,它可以直接访问成员变量agename,而不需要指定我们说的是哪个对象。

        还要注意main() 中声明foo 并调用其成员函数abc 的语法。与原帖的主要区别在于对象foo的存在。

        #include <iostream>
        
        struct xyz {
            int age = 20;
            string name = "name";
        
            void abc() {
                int num;
                std::cin >> num;
                switch (num) {
                case 1: std::cout << age << "\n";
                    return;
                case 2: std::cout << name << "\n";
                    return;
                }
            }
        };
        
        int main()
        {
            xyz foo;
            for(;;)
                foo.abc();
        }
        

        【讨论】:

          猜你喜欢
          • 2015-10-08
          • 1970-01-01
          • 2015-01-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-02
          相关资源
          最近更新 更多