2015-08-10 2 views
1

Я уже несколько часов борюсь с этой проблемой, и я искал каждый термин, который имел для меня смысл. Возможно, я даже уже прочитал соответствующий ответ, но не понял его как такового, потому что я немного смущен указателями.Возвращайте указатель от функции к объекту, инициализированному в main()

Итак, у меня есть структура, которая является частью объекта, который является частью цепочки объектов, которые «привязаны» (если можно так выразиться) в другом объекте, который сам является частью цепочки, которая является «привязано» к объекту привязки, инициализированному в основном.

struct values 
{ 
    double val, ues; 
} 
class small 
{ 
    public: 
     values vals; 
} 
class big 
{ 
    public: 
     small *small_anchor; 
} 
values &getPointerToStruct(big *con) 
{ 
    values *return_vals; 
    if(con->small_anchor->vals.val==10) 
     return_vals=con->small_anchor->vals; 
    return (&return_vals); 
} 
int main() 
{ 
    values *main_values=NULL;//This is supposed to be pointing to the "vals" struct contained inside the "small" object. 
    big *big_anchor; 
    big_anchor = new big; 
    big_anchor->small_anchor = new small; 
    big_anchor->small_anchor->vals.val=10; 
    big_anchor->small_anchor->vals.ues=5; 

    main_values = getPointerToStruct(&big_anchor);//now main_values should be pointing to the "vals" struct 
    //I want to manipulate the value INSIDE the object itself 
    main_values.val++; 
} 

Я попробовал все комбинации &, * и без префикса я не мог придумать, но ничего не даст результата я надеялся. «Самое близкое», что я получил, копировал «vals» (изнутри объекта) в «main_values», чтобы я мог манипулировать там значениями, которые мне не нужны, поскольку я хочу манипулировать ИСТОЧНИКОМ переменных.

Также обратите внимание, что я пропустил процесс прокрутки цепочек, чтобы добраться до объекта, который я пытался достичь, и что «return_vals» кажется произвольным, но бывает, что есть два возможных кандидата, которые могут быть структурой моя программа ищет, а «return_vals» содержит лучший кандидат, найденный до сих пор, и перезаписывается, когда найден лучший или возвращается, когда заканчивается процедура.

+2

Используйте 'return * return_vals' _after_, вы фактически создали экземпляр' values' и указали указатель на 'return_vals', иначе вы получите UB. –

+0

«Я пробовал каждую комбинацию' & ',' * '" - вы делаете это неправильно –

ответ

0

Вы писали

values &getPointerToStruct(big *con) 
{ 
    values *return_vals; 
    if(con->small_anchor->vals.val==10) 
     return_vals=con->small_anchor->vals; 
    return (&return_vals); 
} 

, где я думаю, что вы хотели

values *getPointerToStruct(big *con) 
{ 
    values *return_vals = 0; 
    if(con->small_anchor->vals.val==10) 
     return_vals=&con->small_anchor->vals; 
    return (return_vals); 
} 

Но . в main_values.val++; неправильно в любом случае. Вы должны быть уверены в том, хотите ли вы работать с values* или values&. Вы можете сделать все это с values&, если хотите, но тогда main_values должен быть values& и не объявлен, пока вы не будете готовы его инициализировать. return_vals было бы нецелесообразным в качестве values& из-за заявленного требования о том, что полный код дает ему предварительный адрес, который условно изменяется позже. Но даже с return_vals в качестве values* вы все равно можете вернуть values&, если это то, что вы предпочли.

+0

Полностью сделал трюк. Также я ценю более подробное объяснение, которое вы указали ниже своего исправленного примера. – wexa

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