2014-05-24 65 views
0

我在西班牙語網站(http://trucosinformaticos.wordpress.com/2010/12/12/programacion-orientado-a-objetos-en-c/)中發現了這種黑客攻擊。C中的類(不是C++)

我要創建C(不是C++)一個 「類」,但是當我編譯,我得到下一個錯誤:

source.c(25): warning C4047: 'function' : 'Car' differs in levels of indirection from 'Car *' 
source.c(25): warning C4024: 'changeYears' : different types for formal and actual parameter 1 

這是我的代碼:

#include <string.h> 

typedef struct Car* Car; 

// class Car 
// { 
     struct Car 
     { 
      int years; 
      //char model[100]; 
     }; 


     void changeYears(Car this, int years) 
     { 
      this->years = years; 
     } 
// } 


int main(void) 
{ 
    Car my_cars[10]; 
    //nombrar(mis_alumnos[0], "Pepito"); 
    changeYears(&my_cars[0], 6); // My car has now 6 years 

    return 0; 
} 
+13

你做出大量的代碼通過隱藏背後的typedef指針混亂。我建議不要這樣做。 –

+2

[項目爲「OO在C」](http://www.cs.rit.edu/~ats/books/ooc.pdf) –

+1

請問一個新的問題,而不是編輯現有的一個。 – merlin2011

回答

5

我會同意@Oli Charlesworth隱藏在typedef之後的指針是一種很容易讓你自己和其他人混淆的方式。

但是,要使代碼編譯和工作,只需在my_cars之前刪除&運算符。您還需要爲這些指針分配內存。我想說的是,首先你犯這個錯誤的原因是你對隱藏指針感到困惑。

#include <string.h> 

typedef struct Car* Car; 

struct Car 
{ 
    int years; 
    //char model[100]; 
}; 


void changeYears(Car this, int years) 
{ 
    this->years = years; 
} 


int main(void) 
{ 
    // An array of struct char* 
    Car my_cars[10]; 
    int i; 
    for (i = 0; i < 10; i++) 
     my_cars[i] = malloc(sizeof(struct Car)); 
    changeYears(my_cars[0], 6); // My car has now 6 years 

    return 0; 
} 

這是一個更合理的方法來實現這個沒有隱藏指針。

#include <string.h> 

typedef struct 
{ 
    int years; 
    //char model[100]; 
} Car; 


void changeYears(Car* this, int years) 
{ 
    this->years = years; 
} 


int main(void) 
{ 
    Car my_cars[10]; 
    changeYears(&my_cars[0], 6); // My car has now 6 years 
    return 0; 
} 
+0

@ user3602030我犯了編輯錯誤。現在修好 – merlin2011

+0

完美。請參閱我編輯的帖子,看看我關於這個問題的新問題。 – user3602030

1

我覺得這是你在找什麼:

(更簡單地實施,你想要什麼)

CODE:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

typedef struct 
{ 
    int years; 

} Car; 


void changeYears(Car *this, int years) 
{ 
    this->years = years; 
} 


int main(void) 
{ 
    Car *car = malloc(sizeof(Car)); 
    changeYears(car, 2014); 

    printf("car.years = %d\n", car->years); 

    free(car); 
    return 0; 
} 

OUTPUT:

car.year = 2014 
+0

感謝您的回答。使用此代碼的一些優點?看到@ merlin2011的代碼 – user3602030

+0

當他在他展示的第二個例子中使用你的方法時,我正在使用動態內存分配來創建單個汽車「對象」。 (在第一個例子中,他創建了一個指向多個「對象」的指針數組,但我不認爲這就是你想要的) –

+0

然後你的源代碼和merlin2011的源代碼使用相同的內存,不是嗎?謝謝。 – user3602030