2012-03-07 35 views
0

我對C++非常陌生,來自Java和C。我的書沒有提及私有函數,Google搜索也沒有太多變化。這對我來說應該是微不足道的,但我無法讓它工作。C++私有函數 - 未在此範圍內錯誤

我有這樣的代碼:

#ifndef RUNDATABASE_H 
#define RUNDATABASE_H 
#include <iostream> 
#include <string> 

class RunDatabase 
{ 
    public: 
     int main(); 
    protected: 
    private: 
     bool checkIfProperID(std::string); 
}; 

#endif // RUNDATABASE_H 

而在另一個文件:

#include "RunDatabase.h" 

int main() 
{ 

    std::string id; // after this, I initialize id 

    if(!checkIfProperID(id)) 
    { 
     std::cout << "Improperly formatted student ID, must be numeric" << std::endl; 
     break; 
    } 

} 

bool RunDatabase::checkIfProperID(std::string id) 
{ 
    return true; 
} 

我得到這個錯誤:error: 'checkIfProperID' was not declared in this scope

使用MinGW的G ++ 4.4.1在Windows 7 64位。

感謝您的任何幫助。

+2

如果你不知道這個,如果你從Java中來的?抱歉。無論如何,答案會很清楚。 – Marlon 2012-03-07 02:08:42

+0

@Marlon由於main與checkIfProperId在同一個類中,所以我不明白爲什麼其他函數不在該範圍內。你可以在main中做同樣的事情,但是這個方法顯然必須是靜態的,或者你需要實例化同一個類的新對象。 – jn1kk 2012-03-07 02:10:26

+0

如果你的書沒有提到私有函數,你應該*真的*放棄它並得到[一本值得這個名字的書](http://stackoverflow.com/q/388242/46642)。 – 2012-03-07 02:18:07

回答

1

checkIfProperIDRunDatabase的方法。這意味着您需要有一個RunDatabase對象才能撥打checkIfProperID

RunDatabase rd; 
rd.checkIfProperID(id); 

I don't see why the other function is not in the scope.

的 「範圍」 這裏是一流的。

RunDatabase::checkIfProperID 

注意範圍解析運算符::。這意味着該方法屬於類,而不是全局範圍。

+0

那麼主要功能是不是班的一部分? – jn1kk 2012-03-07 02:13:39

+1

@skynorth號C和C++中的入口點'main'在全局範圍內聲明。你有一個誤解,認爲'RunDatabase :: main'是入口點。 'RunDatabase :: main'與'main'不一樣。 – Marlon 2012-03-07 02:14:17

+0

我從Tomasz Muldner的書籍「C++ Programming With Design Patterns Revealed」中學習C++,並且沒有提到這一點。謝謝!你可以看到我是如何困惑的,因爲main是Java類中的一部分。在一秒鐘內接受答案。 – jn1kk 2012-03-07 02:15:57

1

與Java不同,C++允許獨立功能。在運行程序時調用的main函數是獨立的main,而不是成員main。如果您修改您的CPP文件如下,事情應該編譯:

int main() { 
    RunDatabase rdb; 
    rdb.main(); 
} 

RunDatabase::main() { 
    // the code of the main function from your post 
} 
+0

對不起,不能接受你的回答,因爲有人已經給了我一個答案。但這是我會用到的。 +1 – jn1kk 2012-03-07 02:17:42

1

的問題是,main不作爲RunDatabase成員實現。

int main() 
{ 

應該

int RunDatabase::main() 
{ 

然後,您將需要一個main()功能,你的程序將在開始執行。

而且其啓動主功能後,考慮不命名你的類的成員函數執行,以避免混淆。例如:

class RunDatabase 
{ 
public: 
    int execute(); 
protected: 
private: 
    bool checkIfProperID(std::string); 
}; 

int RunDatabase::execute() 
{ 

    std::string id; // after this, I initialize id 

    if(!checkIfProperID(id)) 
    { 
     std::cout << "Improperly formatted student ID, must be numeric" << std::endl; 
     break; 
    } 

} 

/// runs when the program starts 
int main() 
{ 
    RunDatabase runDatabase; 
    runDatabase.execute(); 
}