C ++:如何通过没有符号的指针调用?

时间:2016-11-22 21:56:29

标签: c++ function pointers struct call

如何通过指针调用函数而不使用函数调用中的&符号来传递结构。我只能编辑函数定义,而不能调用函数的方式。可以使用引用调用,但我想通过指针调用,有没有办法做到这一点?

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

int main(){
Some_Func(My_Struct);
}

4 个答案:

答案 0 :(得分:2)

我90%确定这不是您正在寻找的答案,但无论如何我会将其发布给剩下的10%的怀疑:

看看std::addressof(T&)。它在不使用&符号的情况下为您提供指针。

答案 1 :(得分: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 :(得分: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&),您可以在C +中使用std::addressof() +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));
}

答案 3 :(得分: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;
}

输出:

5

4