如何解决取消引用指向对象的 void 指针
以以下代码段作为最低工作示例:
#include <iostream>
class Object_A
{
public:
int attribute_a,attribute_b;
Object_A(int a,int b){
this->attribute_a = a;
this->attribute_b = b;
}
int object_method(){
std::cout << "Hello from Object A: " << std::endl;
return (this->a + this->b);
}
};
class Object_B
{
public:
int attribute_c,attribute_d;
Object_B(int c,int d){
this->attribute_c = c;
this->attribute_d = d;
}
int object_method(){
std::cout << "Hello from Object B" << std::endl;
return (this->c + this->d);
}
};
class Object_Omega
{
public:
Object_A alpha;
Object_B beta;
Object_Omega (Object_A first,Object_B second):
alpha(first),beta(second)
{}
int foobar(int a){ return a; }
};
void according_to_user_input(bool input,Object_Omega obj)
{
void * either_A_or_B;
if (input){ either_A_or_B = & obj.alpha; }
else { either_A_or_B = & obj.beta; }
/* problem here */
for(int i = 0; i < either_A_or_B->object_method(); i++)
{
std::cout << i << std::endl;
}
}
int main()
{
/* this happens somewhere */
Object_A new_A = Object_A(1,2);
Object_B new_B = Object_B(3,4);
Object_Omega W = Object_Omega(new_A,new_B);
according_to_user_input(true/*false*/,W);
return 0;
}
我希望使用 void
指针(例如,在函数 according_to_user_input
内),但我正在努力理解正确的方法来做到这一点。类似的问题也有人问过 [1],[2] 但我没能在从指针指向的值是自定义对象的情况下使这项工作成功。
鉴于用户输入,我希望从 object_method()
或从 A
通过 B
对象调用 Omega
。不幸的是,我一直在处理的代码按原样展示了这种行为,而不是作为对象之间的继承关系,以避免丑陋的 void
C-like 而绝对不是 C++-like 场景。
先谢谢你!
解决方法
您不能通过指向 void
的指针进行间接访问。并且不需要指向 void
的指针。
最简单的解决方案是:
int number = 1;
std::cout << input
? obj.alpha.object_method(number)
: obj.beta.object_method(number);
对于编辑后的问题:以上仍然有效,但您可以使用函数模板摆脱复杂代码的重复。这是一个使用 lambda 的示例:
auto do_stuff = [](auto& either_A_or_B) {
for(int i = 0; i < either_A_or_B.object_method(); i++)
{
std::cout << i << std::endl;
}
};
input
? do_stuff(obj.alpha)
: do_stuff(obj.beta);
附言避免使用 C 风格的强制转换。
,这不是 void*
的一个很好的用途,如果像你评论的那样,你不能使用继承,而实际问题不仅仅是控制台输出,那么你仍然可以使用函数模板
template <class T>
void according_to_user_input(T &obj)
{
std::cout << obj.object_method();
}
并像这样使用它
if (input)
according_to_user_input<Object_A>(W.alpha);
else
according_to_user_input<Object_B>(W.beta);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。