5

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

谢谢。

4

10 回答 10

9

您需要一个in类型的成员对象foo::packetclass 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在 inside foo,它也不包含在foo成员对象中。它只是一个包含在另一个类中的类。对于要使用的类,你必须有它的对象(一个类也可以在没有它的对象的情况下使用,但是,嗯......)。

于 2013-06-05T01:55:42.653 回答
3

在您的 classFoo中,您已经定义了一个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;
}
于 2013-06-05T01:56:46.690 回答
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
}
于 2013-06-05T01:57:05.423 回答
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);
于 2013-06-05T02:05:51.633 回答
0

您声明了该结构,但您从未在其中放入任何数据。

于 2013-06-05T02:33:26.477 回答
0

您刚刚定义了结构。尝试这样的事情 -

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

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

于 2013-06-05T01:55:01.873 回答
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当它完成时。

于 2013-06-05T01:55:14.183 回答
0

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

于 2013-06-05T01:59:13.887 回答
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 并使用点运算符访问元素

于 2014-04-14T04:34:39.673 回答
0

类 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->packet.(...)or访问 x 和 y foo_object.packet.(...)

于 2013-06-05T01:57:24.567 回答