2014-10-07 50 views
1

当将结构转换为指针时,出现“无法转换为指针类型”错误。无法转换为指针类型,投射结构

我试图将ObjectExtended类型的结构强制转换为ObjectBase的指针,ObjectExtended的第一个成员是指向ObjectBase的指针,因此它应该可以工作。

下面的代码:

typedef struct ObjectBase 
{ 
    int integer1; 
    int integer2; 
}ObjectBase; 

typedef struct ObjectExtended 
{ 
    ObjectBase* baseObj; 
    char* string; 
}ObjectExtended; 

int main(int argc,char** argv) 
{ 
    ObjectExtended* objExtended = malloc(sizeof(ObjectExtended)); 
    objExtended->string = "TEST_OBJECT"; 

    objExtended->baseObj = malloc(sizeof(ObjectBase)); 
    objExtended->baseObj->integer1 = 10; 
    objExtended->baseObj->integer2 = 11; 

    printf("Extended Object:\n"); 
    printf("\tString: %s\n",objExtended->string); 
    printf("\tInt1: %i\n",objExtended->baseObj->integer1); 
    printf("\tInt2: %i\n",objExtended->baseObj->integer2); 

    ObjectBase* objBase = (ObjectBase*)(*objExtended); 
    printf("Base Object:\n"); 
    printf("\tInt1: %i\n",objBase->integer1); 
    printf("\tInt2: %i\n",objBase->integer2); 

    free(objExtended->baseObj); 
    free(objExtended); 
    return 0; 
} 
+0

您必须将结构本身作为你的派生类(这么说),而不是一个指针,它的第一个成员。 – michaelmeyer 2014-10-07 19:09:17

+0

这是正确的:您不能将结构转换为指针(ObjectBase * objBase =(ObjectBase *)(* objExtended);')。他们不是一回事。然而,你可以这样做:'ObjectBase * objBase =(ObjectBase *)objExtended;' – lurker 2014-10-07 19:09:38

+0

是否有一种方法来使用指针,而不是结构 – Helios41 2014-10-07 19:16:53

回答

0
ObjectBase* objBase = (ObjectBase*)(*objExtended); 

应该

ObjectBase* objBase = (ObjectBase*)objExtended; 

我想。您无需解除引用objExtended

+0

,如果ObjectExtended中的ObjectBase指针不是指针 – Helios41 2014-10-07 19:12:32

0

看来你需要ObectBaseObjectExtended的“组件”。只需使用领域

ObjectBase* objBase = objExtended->baseObj; 

这是

ObjectBase* objBase = (*objExtended).baseObj; 

对于类似对象的铸造只是另一种拼写的名字,它根本就没有在C中定义,只标类型允许类型转换,你不应该试图欺骗C.

的类型系统
+0

我应该能够把它投给它的第一个成员,还是我错了? – Helios41 2014-10-07 20:09:21

+0

@ Helios41:您可以将一个结构_pointer_转换为_pointer_它的第一个成员。 – mafso 2014-10-07 22:14:15

+0

@ Helios41,你可以,只要你能始终保证它是第一个成员。但是这个属性很难保持,并且投射会取消所有可能的类型检查。使用刚才定义的struct字段,并且可能强加一些命名约定,对于您和编译器来说更容易检查。 – 2014-10-07 23:10:46

0

更改您的代码

ObjectBase* objBase = (ObjectBase *)objExtended; //Compiles and running, but gives wrong answer. 

对于正确的答案,你可以写

ObjectBase* objBase = (ObjectBase *)objExtended->baseObj; 

ObjectBase* objBase = objExtended->baseObj;