【问题标题】:accessing member of structure within a class访问类中结构的成员
【发布时间】:2013-05-31 14:01:57
【问题描述】:

我有一个 .hpp 和 .cpp 文件。我想访问一个类中结构中的变量,该类恰好位于 .cpp 文件的头 .hpp 文件中。

在.hpp中,我有

class foo{

public:
       struct packet{
         int x;
         u_int y;
      };

};

 foo(const char*name)
:m_name(name){}

在 .cpp 中我做了:

foo *foo_1 = &foo;
printf("The value of x is : %d",foo_1->packet.x);
printf ("The value of y is : %u", foo_1->packet.y);

执行此操作时,我收到以下错误:

code_1.cpp:117: error: expected primary-expression before ‘;’ token
code_1.cpp:118: error: invalid use of ‘struct foo::packet’
code_1.cpp:119: error: invalid use of ‘struct foo::packet’
make: *** [code_1] Error 1

我的目标是在 cpp 文件中获取 x 和 y 的值。任何建议/想法将不胜感激。

谢谢。

【问题讨论】:

    标签: c++ class pointers struct structure


    【解决方案1】:

    您需要class foo 中的foo::packet 类型的成员对象

    class foo{
    
    public:
          struct packet{
             int x;
             u_int y;
          };
    
          packet my_packet;   // <- THIS
    };
    

    在您的 .cpp 中,您应该这样做:

    foo *foo_1 = &foo;
    printf("The value of x is : %d",foo_1->my_packet.x);
    printf ("The value of y is : %u", foo_1->my_packet.y);
    

    您必须记住,即使packetfoo 中,它也不作为成员对象包含在foo 中。它只是一个包含在另一个类中的类。对于要使用的类,你必须有它的对象(一个类也可以在没有它的对象的情况下使用,但是,嗯......)。

    【讨论】:

    • 向我抛出错误:code_1.cpp:117:错误:没有匹配函数调用 'foo::foo()' code.hpp:170:注意:候选人是:foo::foo( const char*) code.hpp:159: 注意: foo::foo(const foo&) make: *** [code_1] Error 1
    • @learning 这是您的构造函数的问题,恕我直言,超出了您的问题范围。对不起。
    • 没问题。谢谢您的帮助。下面的评论说声明一个指针并将其指向一个类的地址是一个坏主意。会不会有问题,分配foo_1,foo的地址。
    • @learning 指针会遇到很多问题。我的建议?尽量减少它们的使用。只需执行foo myFoo;,您将永远不必处理复杂的指针。
    • @Mark Garcia:直到他尝试返回一个指向临时变量的指针,该临时变量恰好在函数返回时不再存在:/
    【解决方案2】:

    在你的类Foo 中,你定义了一个packet 结构,但是你还没有声明它的任何实例。你想要的是(这是一个可编译的独立示例):

    #include <iostream>
    
    class Foo {
    public:
      struct Packet{
        Packet() : x(0), y(0) {}
        int x;
        int y;
      } packet;
    };
    
    int main(int, char**)
    {
      Foo foo_1;
      std::cout << "The value of x is: " << foo_1.packet.x << std::endl;
      std::cout << "The value of y is: " << foo_1.packet.y << std::endl;
    }
    

    【讨论】:

      【解决方案3】:

      packet 不是该类的数据成员,但它定义它的类。您需要实例化该类型的对象才能以这种方式使用它:

      class foo
      {
      public:
             foo() {} // A default constructor is also needed
             struct
             {
               int x;
               u_int y;
            } packet;
      }; // -- don't forget that semicolon
      
      int main()
      {
          foo *foo_1 = new foo(); // instantiate a new object on the heap
          printf("The value of x is : %d",foo_1->packet.x);
          printf("The value of y is : %u", foo_1->packet.y);
      
          delete foo_1; // release the memory
      }
      

      【讨论】:

      • 由于构造函数签名,我收到错误为:错误:没有匹配函数调用 'foo::foo()' code.hpp:170:注意:候选人是:foo::foo( const char*) code.hpp:159: note: foo::foo(const foo&) 知道如何解决这个错误吗?
      • @learning 抱歉。您需要为您的类添加一个默认构造函数:foo() {}。我会用代码更新我的帖子。
      • 知道了。感谢您的帮助。
      【解决方案4】:

      你刚刚定义了结构体。 试试这样的 -

      struct packet{
      int x;
      u_int y;
      }test;

      在您的 cpp 中,像这样访问您的结构元素 -
      foo_1.test.x

      【讨论】:

        【解决方案5】:

        类中的 struct 声明不会创建它的实例 - 只是将其定义为 foo 中的包含结构。
        如果在类中创建结构实例,则可以从包含指针中引用它:

           struct packet{
             int x;
             u_int y;
          } m_packet;
        

        现在你可以说foo_1-&gt;m_packet.x = 3;

        另外,您需要创建一个 foo 的实例(在您的代码中,您尝试获取类名的地址,但这是行不通的): foo* foo_1 = new foo;

        然后,delete foo_1 完成后。

        【讨论】:

          【解决方案6】:

          类 foo 没有成员数据包,但它包含另一个名为“数据包”的类/结构类型。 您必须提供该类型的成员。

          无法进行自动取款机测试,但您可以尝试

          class foo{
          
          public:
                 struct {
                   int x;
                   u_int y;
                } packet;
          
          }
          

          class foo{
          public:
                pack packet;
                struct pack {
                   int x;
                   u_int y;
                };
          
          }
          

          通过foo_ptr-&gt;packet.(...)foo_object.packet.(...) 访问x 和y。

          【讨论】:

            【解决方案7】:

            除了与数据包相关的业务之外,foo *foo_1 = &amp;foo; 很糟糕,您不能只获取变量的类的地址。

            【讨论】:

              【解决方案8】:

              在 .hpp 中,您需要声明一个结构类型的变量。 例如,

              packet Packet;
              

              在你的班级里

              在 .cpp 中,试试这个

              foo *foo_ptr = new foo; // creating new foo object in the heap memory with a pointer  foo_ptr
              printf("The value of x is : %d",foo_ptr->Packet.x);
              printf ("The value of y is : %u", foo_ptr->Packet.y);
              

              【讨论】:

                【解决方案9】:

                你声明了这个结构,但你从来没有在里面放任何数据。

                【讨论】:

                  【解决方案10】:

                  试试

                  struct Vehicle
                      {
                      int wheels;
                      char vname[20];
                      char color[10];
                  }v1 = {4,"Nano","Red"};
                  
                  int main()
                  {
                  printf("Vehicle No of Wheels : %d",v1.wheels);
                  printf("Vehicle Name           : %s",v1.vname);
                  printf("Vehicle Color          : %s",v1.color);
                  return(0);
                  }
                  

                  希望这可以帮助你 我们将结构名称命名为 V1,并使用点运算符访问元素

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2023-03-22
                    • 2022-01-04
                    • 1970-01-01
                    • 2014-11-30
                    • 2014-08-09
                    • 1970-01-01
                    • 2017-06-11
                    • 1970-01-01
                    相关资源
                    最近更新 更多