不明白意图的一句代码求解释

ayang008 2011-01-27 03:31:35
viod ClassA::InitClassDefault( ClassB* In )
{
*(void**)this = *(void**)In; //此句为什么这么写?干啥用?
.....
}
...全文
172 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
mstlq 2011-01-28
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 szuzsq 的回复:]

引用 4 楼 hai040 的回复:

把A类的前4/8字节替换成B类的
估计这两个类的第一个成员是指针


hai040兄台已经说得清清楚楚了,各位相当然地钻了牛角尖,又不虚心听取别人的意见.

C/C++ code

int a[2]={1,2};
int b[2]={3,4};
//a=b;
//这句编不过,但很明显,楼上的意图本来是想将a作为指针指向数组……
[/Quote]
考虑到这是c++版,考虑楼主的语境,考虑到该函数的签名,多半是虚表指针的处理……
看到一个人在搬砖头,可以说他在准备砌墙,也可以说他在盖大房子,第二个答案能提供更多的信息……
szuzsq 2011-01-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hai040 的回复:]

把A类的前4/8字节替换成B类的
估计这两个类的第一个成员是指针
[/Quote]

hai040兄台已经说得清清楚楚了,各位相当然地钻了牛角尖,又不虚心听取别人的意见.


int a[2]={1,2};
int b[2]={3,4};
//a=b;
//这句编不过,但很明显,楼上的意图本来是想将a作为指针指向数组b;或者想将数组b的数据赋予数组a;

//a----------0x0012ff24
// [0]------1
// [1]------2
//b----------0x0012ff1c
// [0]------3
// [1]------4
*(void **)a=*(void **)b;
//a----------0x0012ff24 //a,b的地址都没变;
// [0]------3 //也不是说整个数组a的数据都等于数组b; a[0]==b[0]; a[1]!=b[1];
// [1]------2
//b----------0x0012ff1c
// [0]------3
// [1]------4


虚表指针听起来很时尚,这里关它屁事!!!!!!!!!!!!!!!!!!!!!!!!
mstlq 2011-01-28
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 szuzsq 的回复:]
楼上的,无代码无真相.
写出实例证明你那个替换虚表指针的说法,please
[/Quote]
哈哈,看完之后给我散点分吧^_^

#include<iostream>
using namespace std;

struct testBase
{
virtual void show() {cout << "base" << endl;}

};

struct testDrv: public testBase
{
virtual void show() {cout << "Derived" << endl;}
void InitClassDefault(testBase* In)
{
*(void**)this = *(void**)In;

}
};



int main(int argc, char** argv)
{
testBase tb;
testBase *pb=new testDrv();
pb->show();
dynamic_cast<testDrv *>(pb)->InitClassDefault(&tb);
pb->show();
return 0;
}
szuzsq 2011-01-28
  • 打赏
  • 举报
回复
楼上的,无代码无真相.
写出实例证明你那个替换虚表指针的说法,please
Ainray 2011-01-27
  • 打赏
  • 举报
回复
viod ClassA::InitClassDefault( ClassB* In )
{
*(void**)this = *(void**)In;
}
我的想法:this 是指向ClassA对象的,In是指ClassB类对象的,通过这个函数应该对ClassA对象初始化,如果是把ClassB的成员照单全部拷贝给ClassA,应该可以这样,*(void *)this=*(void *)in;但是不仅拷贝,而是想通过ClassA的初始化成员函数InitClassDefault对ClassB作某种操作,这时我们应该是让ClassA类型的指针与ClassB对象指针in指向同一存储单元,以便调用函数时能够对实参有真正的操作;但是不能直接通过指针赋值:this=in,因为this是常指针,这时应该强制转换this本身,而不是强制转换this所指的对象,所以用二级指针。强制把常指针转换为变量,*(void **)的效果相当于强制转换的变量指针。下面有个例子:
#include<iostream.h>
void main(void)
{
int a[2];
int b[2];
int *p=NULL;p=b;//变量指针直接赋值
a=b;//编译有错误:error C2106: '=' : left operand must be l-value
//数组名是一个常量指针
*(void **)a=*(void **)b;//能通过
}
以上是我的理解,如果有什么不对的,还请高手指教!
ayang008 2011-01-27
  • 打赏
  • 举报
回复
谢谢大家,这确实是虚表指针的传递。我也明白了。
pengzhixi 2011-01-27
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 pengzhixi 的回复:]
就好比memcpy((void**)this,(void**)In,sizeof(void*));
除非你非常有把握,否则不怎么死的都不知道
[/Quote]

更正下。
zyyoung 2011-01-27
  • 打赏
  • 举报
回复
虚表指针存放在类对象的前4个字节中,我们首先需要将类对象的首地址转化成int型指针,并通过这个int 型指针获得前4个字节的内容,这个内容就是虚表的地址
szuzsq 2011-01-27
  • 打赏
  • 举报
回复

road tibet;
tibet._long = 1956; //青藏铁路长1956
*(int*) (&tibet) = *(int*) (&bmw); //路长200
szuzsq 2011-01-27
  • 打赏
  • 举报
回复

#include <stdio.h>

struct road {
int _long; //类或结构的第一个元素
//...
};

struct car {
int oil;
//...
};

struct driver {
char* name;
//...
};

void run(int oil) {
printf("-----------%d\n", oil);
}

void delay(char* name) {
printf("-----------%s\n", name);
}

void main() {
car bmw;
bmw.oil = 200;
run(bmw.oil);

char* p = &bmw;
int* poil = (int*)p; //在内存里,假如bmw汽车所在的地址为0x888EEE,那么它的第一个元素oil所在的地址,就是对象本身的地址,即0x888EEE.
//所以,以下调用
run(*poil);
//等价于
run(*(int*)p);
//也就是说*(int*)p的意义为,获得汽车指针p处的第一个元素(类型为int)的值

//***************总结******************
//当一个指针,我们知道它的类型时,可以直接取它的第一个元素的值
//pcar.oil
//proad._long

//当我们不知道这个指针的类型,但又知道它的第一个元素的类型时,就只能这样取这个元素的值了
//*(int*)p

//以此类推
driver rene;
rene.name = "rene's baby";
delay(rene.name);

driver* p2 = &rene;
char** pname = (char**)p2;
delay(*pname);
//等价于
delay(*(char**)p2);
}
pstrunner 2011-01-27
  • 打赏
  • 举报
回复
为啥用void**呢?不清楚。
难道不可以直接赋值吗?
*this = *In;
pengzhixi 2011-01-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lvshaoqing 的回复:]
引用 5 楼 mstlq 的回复:

把虚表指针换了……
他换的是this指针。 怎么换虚表指针?
[/Quote]
*this=*In;这样你就知道是否换没没虚表指针了
pengzhixi 2011-01-27
  • 打赏
  • 举报
回复
就好比memcpy((void**)this,(void**)In,sizeof(*In));
除非你非常有把握,否则不怎么死的都不知道
lvshaoqing 2011-01-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 mstlq 的回复:]

把虚表指针换了……
[/Quote]

他换的是this指针。 怎么换虚表指针?
mstlq 2011-01-27
  • 打赏
  • 举报
回复
把虚表指针换了……
hai040 2011-01-27
  • 打赏
  • 举报
回复
把A类的前4/8字节替换成B类的
估计这两个类的第一个成员是指针
lvshaoqing 2011-01-27
  • 打赏
  • 举报
回复
换this指针干嘛。
雪人2015 2011-01-27
  • 打赏
  • 举报
回复
是不是*(void*)this=*(void*)In;啊,
按楼主写的,读不懂。
望高手指点。
bdmh 2011-01-27
  • 打赏
  • 举报
回复
感觉这是个类型转换,把ClassA指向了ClassB

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧