2016-11-22 3 views
-5

Как можно было бы вызвать функцию по указателю без использования амперсанда в вызове функции, где я передаю структуру. Я могу только изменить определение функции, а не способ вызова функции. Можно использовать вызов по ссылке, но я бы хотел вызвать по указателю, есть ли способ сделать это?C++: Как вызвать указатель без амперсанда?

void Some_Func(struct TheStruct &My_struct){ 
    My_struct->member = 4; // Would like to do this! 
} 

int main(){ 
Some_Func(My_Struct); 
} 
+5

проблему XY снова. Зачем вам нужен указатель? –

+2

Почему? Что не так с написанием 'My_struct.member = 4;'? – EJP

+0

Ваша клавиатура лишена знака амперсанда или почему вы не хотите его использовать? Возможно, посмотрите здесь: https://www.google.de/search?q=cheap+keyboard&ie=utf-8&oe=utf-8&client=firefox-b-ab&gfe_rd=cr&ei=1b80WLzNIs7j8wel0J-4Ag#q=cheap+keyboard&tbm= shop & spd = 5151555981146022932 – kay

ответ

2

Честно говоря, я думаю, этот вопрос был вызван каким-то недоразумение .... Давайте предположим, что у вас есть это (рабочий) код:

struct TheStruct { int member;}; 
void Some_Func(struct TheStruct &My_struct){ 
    // some implementation 
} 

int main(){ 
    TheStruct x; 
    Some_Func(x); 
} 

Вы говорите

можно изменить только определение функции, а не способ вызова функции.

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

Единственный способ использовать -> внутри функции

void Some_Func(struct TheStruct &My_struct){ 
    TheStruct* x = &MyStruct; 
    x->member = 4; 
} 

Тем не менее, это не единственная причина, чтобы сделать это (если . на клавиатуре не работает), и это делает код в заблуждение читать ,

2

Я 90% уверен, что это не ответ, который вы ищете, но я выложу его на оставшиеся 10% сомнения все равно:

Посмотрите std::addressof(T&). Он дает вам указатель без использования амперсанда.

+1

хотя бы что-то полезное на этой странице! Я разочарован, что ты не упомянул мой макро-трюк, хотя :) –

0

Это будет работать.

struct TheStruct { 
    int member; 
}; 

void Some_Func(TheStruct &My_struct){ 
    My_struct.member = 4; 
} 

int main(){ 
    TheStruct My_Struct; 

    My_Struct.member = 5; 
    std::cout << My_Struct.member << std::endl; 

    Some_Func(My_Struct); 
    std::cout << My_Struct.member << std::endl; 

    return 0; 
} 

Выход:

2

При обращении к объекту по ссылке, вы должны использовать оператор . для достижения своих членов:

void Some_Func(TheStruct &My_struct) { 
    My_struct.member = 4; 
} 

int main() { 
    TheStruct My_struct; 
    Some_Func(My_Struct); 

    // or: 
    // TheStruct *My_struct = new My_struct; 
    // Some_Func(*My_Struct); 
    // delete My_struct; 
} 

При доступе в г объект по указателю, вы должны использовать -> или *. оператору достичь своих членов:

void Some_Func(TheStruct *My_struct) { 
    My_struct->member = 4; 
    // or (*My_struct).member = 4; 
} 

int main() { 
    TheStruct My_struct; 
    Some_Func(&My_Struct); 

    // or: 
    // TheStruct *My_struct = new TheStruct; 
    // Some_Func(My_Struct); 
    // delete My_struct; 
} 

Если вы не хотите использовать оператор &, чтобы получить адрес переменной объекта (может быть, потому что it overrides operator&, например), вы можете использовать std::addressof() в C++ 11 и более поздних версий:

int main() { 
    TheStruct My_struct; 
    Some_Func(std::addressof(My_Struct)); 
} 

Или используйте boost::addressof:

#include <boost/utility.hpp> 

int main() { 
    TheStruct My_struct; 
    Some_Func(boost::addressof(My_Struct)); 
} 

Или реализовать addressof() вручную:

template<class T> 
T* my_addressof(T& arg) 
{ 
    return reinterpret_cast<T*>(
     &const_cast<char&>(
      reinterpret_cast<const volatile char&>(arg) 
     ) 
    ); 
} 

int main() { 
    TheStruct My_struct; 
    Some_Func(my_addressof(My_Struct)); 
} 
Смежные вопросы