在类中访问结构体成员

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的值。任何建议/想法都将不胜感激。

谢谢。

10个回答

9
你需要在类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] 错误 1 - Quick Silver
@学习 这是你的构造函数存在问题,虽然我很尊重你的问题,但这已经超出了你问题的范围。抱歉。 - Mark Garcia
没问题。感谢帮助。下面的评论说将指针声明并指向类的地址是一个坏主意。将foo_1赋值为foo的地址会有问题吗? - Quick Silver
@学习:指针会带来很多问题。我的建议是尽量减少使用。只需执行“foo myFoo;”,您就不必处理指针的复杂性了。 - Mark Garcia
@Mark Garcia:这种情况发生在他试图返回一个指向临时变量的指针,而该变量刚好在函数返回时已经被删除:/ - Kuba hasn't forgotten Monica

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

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:注意事项: foo :: foo(const foo&) 您有什么解决这个错误的想法吗? - Quick Silver
@learning 抱歉。你需要为你的类添加一个默认构造函数:foo() {}。我将在我的帖子中更新代码。 - David G

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删除它。


0

类foo没有成员packet,但它包含另一个名为“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。


0
在.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);

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,并通过使用点运算符访问元素。

0
你刚定义了一个结构体。试试像这样做 - packet {
int x;
u_int y;
} test;

然后在你的cpp文件中,像这样访问你的结构元素 -
foo_1.test.x


0

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


0
你声明了结构体,但是你没有往里面放任何数据。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接