2011-10-10 77 views
2

好了,我已經決定要讀一點C++,然後現在,只是爲了讓語法有基本的瞭解。我熟悉Java和一點Python。我已經通過C++讀取了傻瓜書,並且我認爲自己掌握了 - 直到我嘗試創建最簡單的課程。 當時的想法是非常簡單:一類(名爲猿)接受一個參數,一個int,它被存儲爲一個私有字段。它有一個其他函數,一個返回函數,它返回該字段。 main()創建一個實例,並調用該方法打印出變量。簡單的C++構造函數不工作(很基本的)

當時的想法是使用一個字符串,而不是一個整數,但我無法得到它的工作,所以我決定用一個int來代替,這很明顯,沒有任何工作。

如果是任何利息我使用的代碼::塊,Windows 7和g ++編譯器。

這裏是類:

Main.cpp的

#include <iostream> 
#include "ape.h" 

using namespace std; 

int main() 
{ 
    ape asd(10); 
    cout << asd.getNumber(); 
} 

ape.h

#ifndef APE_H 
#define APE_H 

class ape 
{ 
    public: 
     ape(int num); 
     virtual ~ape(); 
     int getNumber(); 
    protected: 
    private: 
     int number; 
}; 

#endif // APE_H 

和ape.cpp

#include "ape.h" 
using namespace std; 

ape::ape(int num) 
{ 
    tall = num; 
} 

ape::~ape() 
{ 
    //dtor 
} 

int getNumber() 
{ 
    return number; 
} 

錯誤消息我得到的似乎對我來說非常隨意,因爲他們正在改變完全隨着我做出的每一個變化,都不是很自我解釋。我可以看到我怎麼聽起來像一個自大的傻瓜,而這整個混亂是編譯器的錯,但我真的沒有看到錯誤消息,什麼是錯誤的,我的代碼之間的任何連接。

這裏別緊張我,第一次。 :)

我想我也許應該補充的錯誤消息: 未定義的引用「猿猿::(INT)」

+0

你在哪裏定義高? – Mansuro

回答

1

您將值分配給一個不存在的變量。

變化:

ape::ape(int num) 
{ 
    tall = num; 
} 

要:

ape::ape(int num) : 
    number(num) 
{ 
} 

而且,我不知道爲什麼你寫析構函數,爲什麼你決定把它virtual。默認情況下,編譯器將生成一個空的析構函數(類似於你的,但不是virtual)。如果你不打算做多態(使用繼承和所有這些「東西」),你可以從代碼中刪除這個析構函數,因爲它只會帶來複雜性而無法獲得收益。

您還需要與類的名稱前綴的方法定義

int ape::getNumber() // Note the "ape::" here 
{ 
    return number; 
} 

最後一兩件事:

您problably還想更改main

int main() 
{ 
    ape asd(10); 
    cout << asd.getNumber() << endl; 
} 

只有當輸出時纔會打印輸入endl o r flush作爲流被緩衝。

關於上次編輯:

我想我也許應該補充的錯誤消息:未定義的引用 爲「猿猿::(INT)」

你可能失敗,鏈接ape.o。在您的編譯文件夾中,您應該有每個.cpp的源文件和.o。您必須將這些目標文件連接在一起以構建您的程序。此消息表明鏈接程序無法找到ape::ape(int)的定義。那是他可能沒有被給予ape.o文件。

長話短說,這裏就是你的編譯命令應該是什麼樣子(使用G ++):

g++ -o main.o -c main.cpp 
g++ -o ape.o -c ape.cpp 
g++ -o program main.o ape.o 
+0

這只是Code :: blocs文件的自動生成。我想我可以不選中有析構函數的選項,但我沒有打擾。 – MartinHaTh

+0

@MartinHaTh哦,我明白了。我不使用Code :: Blocks。其他點靜立不動;)希望這可以幫助。 – ereOn

+1

這些命令做到了。那麼我猜這是Code :: blocks fault。 感謝您的幫助。 – MartinHaTh

0

您正在使用未申報領域「高」。好像你的構造應該是:

 
ape::ape(int num) 
{ 
    number = num; 
} 
+0

始終使用初始化列表來初始化字段。 –

+0

噢,好吧,我的不好,爲了簡​​單起見,我正在用挪威語寫部分字段和函數名,我想我錯過了那個。在發佈之前,我正在更改所有名稱。 – MartinHaTh

3

沒有太大而不實際的錯誤消息說,但至少這裏有一個問題:

int getNumber() 
{ 
    return number; 
} 

這應該是int ape::getNumber()。同樣在你的代碼中,tall沒有定義,應該是number而不是?

0
ape::ape(int num) 
{ 
    tall = num; 
} 

高嗎? tall從哪裏來?該成員被宣佈爲number

更好的將是

ape::ape(int num) { number = num; } 

好多是

ape::ape(int num) : number(num) { } 
0

什麼是高?私人領域被稱爲在你的榜樣數,所以這個功能:

ape::ape(int num) 
{ 
    tall = num; 
} 

應該是:

ape::ape(int num) 
{ 
    number = num; 
} 

然而,在C++中,你應該使用初始化而不是分配。雖然int不是什麼大問題,但對於更復雜的對象,在複製對象時分配會更加昂貴,而在初始化時可以使用複製構造函數。因此約定是在構造函數的主體之前初始化所有變量。

ape::ape(int num) 
    : number(num) 
{ 
} 

而且,請將getNumber()聲明爲const方法。在這裏,你有一個很好的嚮導解釋所有的常量變種:http://developer.kde.org/~wheeler/cpp-pitfalls.html

當你在它,添加缺失類的前綴,你需要的,如果你定義的類的聲明之外的方法:

int ape::getNumber() const 
{ 
    return number; 
} 

作爲最後一條評論,我建議你尋找關於命名成員變量的約定。典型的是mNumber或_number。稍後讓您更輕鬆地閱讀您自己的代碼。

0

您需要在構造函數中設置變量number,然後才能在getNumber中讀取它。 試試這個:

ape::ape(int num) 
{ 
    number = num; 
}