如何通过指针调用函数而不使用函数调用中的&符号来传递结构。我只能编辑函数定义,而不能调用函数的方式。可以使用引用调用,但我想通过指针调用,有没有办法做到这一点?
void Some_Func(struct TheStruct &My_struct){
My_struct->member = 4; // Would like to do this!
}
int main(){
Some_Func(My_Struct);
}
答案 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