accessing member of structure within a class

2019-05-03 08:17发布

问题:

I have an .hpp and .cpp file. I want to access the variable in the structure within a class which happens to be in the header .hpp file, in the .cpp file.

In .hpp, I have

class foo{

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

};

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

In .cpp I did:

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

On doing this I receive the following error:

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

My objective is to get the values of x and y in the cpp file. Any suggestion/idea will be really appreciated.

Thanks.

回答1:

You need a member object of type foo::packet in class foo.

class foo{

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

      packet my_packet;   // <- THIS
};

In your .cpp, you should do:

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

You must remember that even though packet is inside foo, it is not included in foo as a member object. It is just a class enclosed inside another class. And for a class to be used, you must have objects of it (a class can also be used without having objects of it, but, well...).



回答2:

In your class Foo, you have defined a packet struct, but you have not declared any instances of it. What you want is (this is a compileable self-contained example):

#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 is not a data member of the class, but the class that it defines it is however. You need to instantiate an object of that type in order to use it in that way:

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
}


回答4:

You have just defined struct. Try something like this -

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

and in your cpp, access your struct elements like this -
foo_1.test.x



回答5:

The struct declaration in the class does not create an instance of it - just defines it as a contained struct within foo.
If you create a struct instance in the class, you can reference it from the containing pointer:

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

Now you can say foo_1->m_packet.x = 3;, etc.

Also, you need to create an instance of foo (in your code you try to take the address of the class name, which won't work): foo* foo_1 = new foo;

Then, delete foo_1 when done with it.



回答6:

Class foo does not have a member packet but it contains another class/struct type named "packet". You'll have to provide a member of that type.

Can't do a test atm but you could either try

class foo{

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

}

or

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

}

To access x and y via foo_ptr->packet.(...) or foo_object.packet.(...).



回答7:

and besides tha packet-related business, foo *foo_1 = &foo; is bad, you can't take address of a class only of a variable.



回答8:

In .hpp you need to declare a variable with the struct type. For example,

packet Packet;

inside of your class

In .cpp, try this

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:

You declare the struct, but you never put any data in it.



回答10:

Try

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

hope this may help you we gave the structure name as V1 and acessing the elements by the use of dot operator