2011-06-16 120 views
2

'initPhysics'未在此範圍內聲明。函數'未在此範圍內聲明',但它是!不是嗎?

我儘可能簡化了我的程序;這就是:

helloworld.hpp

#ifndef HELLOWORLD_HPP 
#define HELLOWORLD_HPP 

class testWorld { 
    public: 
     testWorld() {} 
     ~testWorld() {} 
     void initPhysics(); 
}; 
#endif 

HELLO.CPP

#include "helloworld.hpp" 
#include <iostream> 

using namespace std; 

void testWorld::initPhysics() { 
    cout << "Initiating physics..." << endl; 
} 

int main(int argc,char** argv) { 
    cout << "Hello World!" << endl; 
    testWorld* world; 
    world = new testWorld(); 
    world<-initPhysics(); 
    return 0; 
} 

我編譯命令

g++ -c hello.cpp 

並且得到錯誤

hello.cpp: In function ‘int main(int, char**)’: 
hello.cpp:14:21: error: ‘initPhysics’ was not declared in this scope 

爲什麼編譯器看不到initPhysics的聲明,即使我包含了helloworld.hpp?

+4

好的,'<-'應該做什麼?你可能是指' - >'。 – 2011-06-16 15:54:47

+0

不應該是世界 - > initPhysics()而不是世界<-initPhysics(),還是我困惑? – check123 2011-06-16 15:55:34

+0

[我不明白這個問題,對我來說工作得很好。 :)](http://ideone.com/r71Dj) – Xeo 2011-06-16 16:36:50

回答

15

應該world->initPhysics(),不world<-initPhysics()

您的版本被解讀爲表達「世界是小於-1乘以全局函數initPhysics()的結果」,但它是全局函數,它可以找不到。

雖然這顯然是測試代碼,但我只想指出,如果您分配的對象爲new,則必須在某處明確delete

+1

而且,如果變量僅用於單個作用域,則可能根本不想動態分配它。 – 2011-06-16 17:17:09

+0

謝謝,和其他所有回答!當然,你們都完全正確。我改變了'<-' to '->',現在它的工作方式就像它應該的那樣。我會盡量記住刪除東西,但我不習慣Java中的東西。 – skalman 2011-06-17 08:20:45

+0

在Java中'<-'做什麼? – 2012-01-02 15:44:30

3

world<-initPhysics()應該是world->initPhysics()

0

你想world->initPhysics();而不是world<-initPhysics();

0
world<-initPhysics(); 

在這裏,你的箭是錯誤的方向。你應該有:

world->initPhysics(); 
0

world<-initPhysics();應該world->initPhysics();

3

學習ptr->member 「在任何PTR成員」 讀->操作者,換句話說,(不<-!):它是一個實際指針的字面表示。所以你的情況應該是

world->initPhysics(); // note the ->, not <- 

然而,雖然這個回答你的問題,這是遠遠不夠的。您的代碼還有其他一些問題。

  1. 有沒有必要先創建一個未初始化的指針,然後初始化它。這是容易出錯的,你應該不是立即對其進行初始化:

    testWorld* world = new testWorld(); 
    world->initPhysics(); 
    
  2. 注意,在C++中的每個對象使用new運營商需要使用delete運營商明確地摧毀創建:

    delete world; // sounds scary, BTW 
    
  3. 你似乎來自像Java或C#這樣的語言,其中的一切都必須是new'd。在C++中,這是不正確的。默認情況下,你應該在棧上創建對象,而不是在堆上:

    testWorld world; 
    world.initPhysics(); 
    
  4. 但仍然有你的代碼有問題。你現在擁有的是所謂的兩階段結構。作爲你的類的用戶,我需要記住在使用它的一個實例之前調用一個初始化函數。但這就是構造函數的用途!構造函數應完全初始化一個對象,以使其處於可用狀態。你應該從構造函數,而不是調用你的初始化函數:

    testWorld() {initPhysics();} 
    

物理學是世界的一個組成部分,而不應添加在事後。 :)

+0

謝謝!你是對的,我習慣於Java,所以當涉及到指針,初始化和刪除事物時,我仍然有很多東西需要學習。 initPhysics(可能)有一個原因不在構造函數中。不知道還有什麼,但我試圖從頭開始重新理解別人的代碼,所以希望我很快會學到它。 – skalman 2011-06-17 08:33:08