【问题标题】:calling a struct member declared in a class调用在类中声明的结构成员
【发布时间】:2020-09-02 23:27:18
【问题描述】:

我正在尝试将函数放置在 struct 中,该 struct 是类的一部分(此处命名为 menu),因此我可以修改专用设置 cpp 文件中的结构(我正在尝试这样做以便我可以在单个源文件中修改我的应用程序中我想要的所有功能,而不是更改所有 cpp 文件中的内容):

// Menu.h
class menu
{
public:
    menu();

    struct pages
    {
        void print_page_1();
        void print_page_2();
    };
};

// Setup.cpp
struct menu::pages
{
    void print_page_1()
    {
        // ...
    }
    void print_page_2()
    {
        // ...
    }
};

然后当我尝试在我的结构中调用函数时遇到错误:

int main()
{
    menu myMenu();
    myMenu.pages.print_page_1(); // error: type name is not allowed
}

这个错误是什么意思,我该如何避免它? 谢谢!

【问题讨论】:

  • 您对struct menu::pages 有两个定义——一个在struct menu 内,一个在struct menu 之外。当structclass 类型被多次定义时,两者都需要相同(本质上指定为相同的一组标记)以满足单一定义规则和不同的编译单元。如果编译器在一个编译单元中看到两个定义,它可以识别两个定义并进行诊断。要定义 menu::pages 的成员函数,请避免重新定义结构 - 而是直接定义成员(例如 void menu::pages::print_page_1() {}

标签: c++ class struct


【解决方案1】:

pagesstruct 的名称,它不是一个对象。您需要在menu 内有一个pages 类型的对象。

否则,您可以在 pages 中包含 static 方法并在不创建对象的情况下调用这些方法。

示例 (live):

#include <iostream>

struct S
{
    struct P
    {
        void print()
        {
            std::cout << "Hello from P!\n";
        }
    } p; // object of P

    struct Q
    {
        static void print()
        {
            std::cout << "Hello from Q!\n";
        }
    };
};

int main()
{
    S s;
    s.p.print();

    S::Q::print();

    return 0;
}

输出:

Hello from P!
Hello from Q!

【讨论】:

    【解决方案2】:

    您需要在菜单中声明一个页面对象。

      #include <iostream>
    
    
    class menu
    {
        std::string p1 = "1";
        std::string p2 = "2";
      public:
    
     struct pages
      {
          menu& m;
          pages(menu &m):m(m){
    
          }
       void print_page_1();
       void print_page_2();
      } pages;
    
      menu():pages(*this){
      }
    };
    
        void menu::pages::print_page_1()
        {
         std::cout << m.p1;// ...
        }
        void menu::pages::print_page_2()
        {
          std::cout << m.p2;// ...
        }
    
    int main() {
        menu myMenu;
        myMenu.pages.print_page_1();
        // your code goes here
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-02
      • 1970-01-01
      • 2018-07-31
      • 2013-09-07
      • 2012-08-04
      • 2012-11-13
      • 1970-01-01
      相关资源
      最近更新 更多