访问类中的结构成员

时间:2013-06-05 01:49:13

标签: c++ class pointers struct structure

我有一个.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的值。任何建议/想法将非常感激。

感谢。

10 个答案:

答案 0 :(得分:8)

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

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);

您必须记住,即使packet位于foo内,它也不会作为成员对象包含在foo中。它只是一个封闭在另一个类中的类。对于要使用的类,您必须具有它的对象(也可以在没有对象的情况下使用类,但是,好吧......)。

答案 1 :(得分:3)

在您的班级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;
}

答案 2 :(得分:2)

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
}

答案 3 :(得分:0)

您刚刚定义了struct。 试试这样的事情 -

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

并在你的cpp中,像这样访问你的struct元素 -
foo_1.test.x

答案 4 :(得分:0)

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

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

现在你可以说foo_1->m_packet.x = 3;等等。

此外,您需要创建一个foo实例(在您的代码中,您尝试获取类名的地址,这将无效): foo* foo_1 = new foo;

然后,delete foo_1完成后。

答案 5 :(得分:0)

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

无法进行测试,但您可以尝试

class foo{

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

}

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

}

通过foo_ptr->packet.(...)foo_object.packet.(...)访问x和y。

答案 6 :(得分:0)

除了与数据包相关的业务之外,foo *foo_1 = &foo;还不好,你不能只接受一个变量类的地址。

答案 7 :(得分:0)

在.hpp中,您需要使用struct类型声明变量。 例如,

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);

答案 8 :(得分:0)

您声明了结构,但您从未在其中添加任何数据。

答案 9 :(得分:0)

尝试

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,并通过使用点运算符

来获取元素