2013-06-05 3 views
3

У меня есть .hpp и .cpp файл. Я хочу получить доступ к переменной в структуре внутри класса, который находится в файле .hpp заголовка, в .cpp-файле.Доступ к члену структуры внутри класса

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

Моя цель заключается в получить значения x и y в файле cpp. Любое предложение/идея будут действительно оценены.

Спасибо.

ответ

6

Вам нужен объект-участник типа 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 в качестве объекта члена. Это просто класс, заключенный внутри другого класса. И для класса, который будет использоваться, у вас должны быть его объекты (класс также можно использовать без его объектов, но, ну ...).

+0

Выдает мне ошибку: code_1.cpp: 117: error: нет подходящей функции для вызова в 'foo :: foo()' code.hpp: 170: note: кандидаты: foo :: foo (const char *) code.hpp: 159: note: foo :: foo (const foo &) make: *** [code_1] Ошибка 1 –

+0

@learni Это проблема с вашим конструктором и с должным уважением выходит за рамки вашего вопроса. Сожалею. –

+0

Не проблема. Спасибо за помощь. В приведенном ниже комментарии говорится, что его плохая идея объявить указатель и указать его на адрес класса. Будет ли это проблемой, учитывая foo_1, адрес foo. –

0

Вы только что определили структуру. Попробуйте что-то вроде этого -

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

и в вашем CPP, получить доступ к STRUCT элементы, как это -
foo_1.test.x

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 когда сделано с ним.

3

В вашем классе Foo вы определили структуру packet, но вы не указали никаких ее экземпляров. Что вы хотите (это compileable самодостаточным пример):

#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 
} 
+0

Из-за записи constructr, я получаю ошибку как: ошибка: нет соответствующей функции для вызов: foo :: foo() ' code.hpp: 170: примечание: кандидаты: foo :: foo (const char *) code.hpp: 159: note: foo :: foo (const foo &) Любая идея, как я могу решить эту ошибку? –

+0

@learning Извините. Вам нужно добавить конструктор по умолчанию в ваш класс: 'foo() {}'. Я обновляю свой пост с помощью кода. – 0x499602D2

+0

Получил. Спасибо за помощь. –

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.(...) или foo_object.packet.(...).

0

и кроме того, связанный с пакетом бизнес, foo *foo_1 = &foo; плохой, вы не можете принимать адрес класса только переменной.

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

Вы объявляете-структуру, но вы никогда не кладите в него любые данные.

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 и acessing элементы с помощью оператора точки

Смежные вопросы