2014-12-06 58 views
1

我剛開始嘗試C++。當試圖從另一個文件中轉發聲明這個類時,我一直遇到這個錯誤: 對'girl'中成員'get_posx'的請求,它是指針類型'Vex *'(也許你打算使用' - >'? )' - >'在嘗試轉發聲明時意味着什麼?

這些都是我已經包含在我的Qt造物主平原C++項目的兩個文件:

main.cpp中:

#include <iostream> 
using namespace std; 

class Vex; //Declares Vex class 

class Obj //Object class 
{ 
int x, y; 
public: 
void set_pos (int,int); 
void move (int, int); 
int get_posx() {return x;} 
int get_posy() {return y;} 
}; 

void Obj::set_pos (int pos_x, int pos_y) //Sets X and Y of Obj 
{ 
x = pos_x; 
y = pos_y; 
} 
void Obj::move (int pos_x, int pos_y) //Changes X and Y of Obj 
{ 
x += pos_x; 
y += pos_y; 
} 

int main() 
{ 
Obj guy; //Guy as Obj class 
Vex* girl; //Girl as (imported)Vex class 
guy.set_pos (0,0); 
while(true == true) 
{ 
int tempx, tempy; 
cout << girl.get_posx(); //Prints x pos. of girl 
cout << "\nX Position: " << guy.get_posx() <<endl; //Prints x pos. of guy 
cout << "Y Position: " << guy.get_posy() <<endl; //Prints y pos. of guy 
cout << "\nX Change:" << endl; 
cin >> tempx; //Asks for x change in guy pos. 
cout << "Y Change:" << endl; 
cin >> tempy; //Asks for y change in guy pos. 
guy.move (tempx, tempy); 
} 
return 0; 
} 

s.cpp:

class Vex 
{ 
int x, y; 
public: 
void exp(); 
int get_pos() {return x;} 
}; 

void Vex::exp() 
{ 
x = 0; 
y = 0; 
} 

什我是否在這裏做錯了,什麼是' - >',我該如何使用它?

+1

由於' - >'在任何前向聲明中都沒有使用,因此標題具有誤導性。 – greatwolf 2014-12-06 05:58:17

回答

3

我想你會更好地學習C++,因爲你似乎缺乏基礎知識;沒有冒犯的意思,只是試圖幫助它。在你的想法中,你有幾個誤解以及實現問題。我甚至不知道從哪裏開始。讓我們看看:

  • 堆和堆棧分配對象(又名。指針與非指針)之間的區別。

    Vex* girl; //Girl as (imported)Vex class 
    ... 
    cout << girl.get_posx(); //Prints x pos. of girl 
    

    指針對象成員在C++通過->訪問,所以你應該修改代碼以這樣的:

    cout << girl->get_posx(); //Prints x pos. of girl 
    //   ^^ 
    
  • 當你可以使用預先聲明。

    class Vex; //Declares Vex class 
    

    當您想訪問類似的成員時,這還不夠。您將需要包括類定義通過include指令,像這樣:

    #include "vex.h" 
    
  • 聲明類一樣,在源文件(又名CPP)

    這通常是錯誤的,雖然不是最終的當然。如果你這樣做,你將無法輕鬆地重用它,除非包含源文件,這是不推薦的。

  • 嚴格地說,C++中沒有「導入」這樣的東西。

    Vex* girl; //Girl as (imported)Vex class 
    //     ^^^^^^^^ 
    

    導入可能在其他編程語言(如python)中找到,但這些工作與包含的工作方式不同。

  • Overcommenting

    不僅是評論有點不全面,但即使是毫無意義的。爭取自我記錄代碼。

  • 你認爲它是以任何方式與Qt相關。

    這不是,即使你如此標記它。它是通用的(和基本的)C++。

  • 對於不改變成員的方法,不使用const。

    這是很好的做法對事情做喜歡把自己的成員,你的代碼,即:

    int get_posx() const {return x;} 
    //    ^^^^^ 
    int get_posy() const {return y;} 
    //    ^^^^^ 
    

    ...以及類似:

    int get_pos() const {return x;} 
    //   ^^^^^ 
    
  • 如何寫一個永遠阻塞循環。

    while(true == true) 
    

    儘管有效,但這是無意義的。

    `while(1)` 
    

    或者乾脆

    `forever()` 
    
    Qt中

    會更優雅。

  • 不一致的編碼風格(如空間使用率)

    ​​
  • 不使用縮進

    你的源代碼,似乎是左對齊,但這不是一個word文檔。而C和C++使用括號,所以它可以工作,而不像在Python中,很難理解。

  • 你似乎不明白什麼是構造函數。

    Obj guy; //Guy as Obj class 
    ... 
    guy.set_pos (0,0); 
    

    在C++中,您建立了一個構造函數或至少用於這種初始化的「init」方法。嚴格來說,使用C++ 11時,您甚至可以避免這樣做,但重點是您不通過設置方法來初始化成員。

+0

謝謝,在此之前,我從一些舊書和Python中學到了非常古老的C++。它很難轉換。 – Fred 2014-12-06 10:18:31

0

女孩被聲明爲一個指向對象VEX:

VEX *女孩

因爲你需要使用 - >運算符代替。以解決女孩對象成員:

girl-> get_posx();

還,因爲它是指針,你需要正確的對象初始化它:

VEX *女孩=新VEX();

其他方式你會得到一個錯誤。

+0

這不會解決OP的問題,因爲你不能在這樣的情況下轉發聲明... – lpapp 2014-12-06 06:50:20

+0

它是在單獨的文件中,因此#include「s.h」將執行此操作。但是,在使用之前,類對象肯定需要被創建和初始化,因爲現在它只是一個指向隨機存儲器地址的空指針。 – Dmitry 2014-12-06 08:39:47

+0

目前,甚至沒有,因爲OP在源文件中而不是頭文件中。 – lpapp 2014-12-06 08:41:52