C++:如何在没有&符号的情况下通过指针调用?
C++: How to call by pointer without ampersand?
如何在我传入结构的函数调用中不使用&符号的情况下通过指针调用函数。我只能编辑函数定义,不能编辑函数的调用方式。可以使用引用调用,但我想通过指针调用,有什么办法吗?
void Some_Func(struct TheStruct &My_struct){
My_struct->member = 4; // Would like to do this!
}
int main(){
Some_Func(My_Struct);
}
我 90% 确定这不是你要找的答案,但我会 post 无论如何,剩下的 10% 的疑问:
看看std::addressof(T&)
。它为您提供了指针而不使用&符号。
老实说,我认为这个问题是由一些误解引发的....假设您有这个(工作)代码:
struct TheStruct { int member;};
void Some_Func(struct TheStruct &My_struct){
// some implementation
}
int main(){
TheStruct x;
Some_Func(x);
}
你说
I can only edit the function definition, not the way the function is being called.
...因此无法使函数将指针作为参数。如果在 main
中有一个实例(不是指针)作为参数传递并且您不允许更改 main
,那么您不能神奇地使参数成为指针。
在函数内部使用->
的唯一方法是
void Some_Func(struct TheStruct &My_struct){
TheStruct* x = &MyStruct;
x->member = 4;
}
但是,没有理由这样做(除非键盘上的 .
坏了),而且它会使代码难以阅读。
这会起作用。
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
通过引用访问对象时,必须使用.
运算符来访问其成员:
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;
}
如果不想使用&
运算符获取对象变量的地址(可能是因为C++11及以后的it overrides operator&
, for instance), you can use std::addressof()
:
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));
}
如何在我传入结构的函数调用中不使用&符号的情况下通过指针调用函数。我只能编辑函数定义,不能编辑函数的调用方式。可以使用引用调用,但我想通过指针调用,有什么办法吗?
void Some_Func(struct TheStruct &My_struct){
My_struct->member = 4; // Would like to do this!
}
int main(){
Some_Func(My_Struct);
}
我 90% 确定这不是你要找的答案,但我会 post 无论如何,剩下的 10% 的疑问:
看看std::addressof(T&)
。它为您提供了指针而不使用&符号。
老实说,我认为这个问题是由一些误解引发的....假设您有这个(工作)代码:
struct TheStruct { int member;};
void Some_Func(struct TheStruct &My_struct){
// some implementation
}
int main(){
TheStruct x;
Some_Func(x);
}
你说
I can only edit the function definition, not the way the function is being called.
...因此无法使函数将指针作为参数。如果在 main
中有一个实例(不是指针)作为参数传递并且您不允许更改 main
,那么您不能神奇地使参数成为指针。
在函数内部使用->
的唯一方法是
void Some_Func(struct TheStruct &My_struct){
TheStruct* x = &MyStruct;
x->member = 4;
}
但是,没有理由这样做(除非键盘上的 .
坏了),而且它会使代码难以阅读。
这会起作用。
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
通过引用访问对象时,必须使用.
运算符来访问其成员:
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;
}
如果不想使用&
运算符获取对象变量的地址(可能是因为C++11及以后的it overrides operator&
, for instance), you can use std::addressof()
:
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));
}