Quick Silver
Quick Silver

Reputation: 433

accessing member of structure within a class

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.

Upvotes: 5

Views: 32799

Answers (10)

Hemanth Kumar
Hemanth Kumar

Reputation: 1

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

Upvotes: 0

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

Upvotes: 3

David G
David G

Reputation: 96845

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
}

Upvotes: 2

Marichyasana
Marichyasana

Reputation: 3154

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

Upvotes: 0

Eric Duhun Kim
Eric Duhun Kim

Reputation: 11

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

Upvotes: 0

Mark Garcia
Mark Garcia

Reputation: 17708

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

Upvotes: 9

Balog Pal
Balog Pal

Reputation: 17233

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

Upvotes: 0

Pixelchemist
Pixelchemist

Reputation: 24956

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.(...).

Upvotes: 0

edtheprogrammerguy
edtheprogrammerguy

Reputation: 6049

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.

Upvotes: 0

priteshbaviskar
priteshbaviskar

Reputation: 2327

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

Upvotes: 0

Related Questions