2014-09-22 69 views
0

該代碼的基礎在教程中找到,所以我不太確定它爲什麼這樣做。類/頭文件 - 無法在沒有對象的情況下調用成員

錯誤:

main.cpp: In function ‘int main()’: 
main.cpp:8:32: error: cannot call member function ‘int TestC::getAnswer()’ without object 
std::cout << TestC::getAnswer() << std::endl; 

的main.cpp

#include <iostream> 
#include "TestC.hpp" 
int main() 
{ 
    TestC(1, 1); 
    std::cout << TestC::getAnswer() << std::endl; 
    return 0; 
} 

TestC.cpp

#include "TestC.hpp" 
TestC::TestC(int x, int y) 
{ 
    gx = x; 
    gy = y; 
} 

int TestC::getSum() 
{ 
    return gx + gy; 
} 

TestC.hpp

#ifndef TestC_H 
#define TestC_H 

class TestC 
{ 
    int gx; 
    int gy; 
public: 
    TestC(int x, int y); 
    int getAnswer(); 
}; 

#endif 

這是怎麼了編譯:

g++ main.cpp -o Main 
+0

爲了'TESTC ::的getAnswer()'工作,'的getAnswer()'將有成爲「TestC」類的「靜態」成員。 – Andro 2014-09-22 17:45:30

+0

所以我把'int getAnswer();'改成'static int getAnswer();'但它仍然不起作用。它只是爲TestC :: TestC()和TestC :: getAnswer()提供了類似的錯誤,用於未定義的引用。 – Nathan 2014-09-22 17:50:43

+0

看完這個,你應該明白,應該看看事情是怎麼樣的。 http://www.learncpp.com/cpp-tutorial/812-static-member-functions/ – Andro 2014-09-22 17:54:54

回答

1

你不只是通過調用構造函數創建對象。你必須以實際申報對象

TestC myC{1, 1}; 
int answer = myC.getAnswer(); 

所以你main功能將變爲

int main() 
{ 
    TestC myC{1, 1}; 
    std::cout << myC.getAnswer() << std::endl; 
    return 0; 
} 
+0

非常感謝。只是關於{}的一個問題,他們總是需要,因爲它是一個構造函數? – Nathan 2014-09-22 17:59:12

+0

你也可以寫'TestC myC = TestC(1,1);'這也很好。你只需要小心諸如'TestC myC();'這會通過聲明一個新函數實際產生一個[最令人頭痛的解析](http://en.wikipedia.org/wiki/Most_vexing_parse),而不是調用默認的構造函數。我只是使用初始化列表語法'{}'來確保我不會遇到這種情況。 – CoryKramer 2014-09-22 18:04:13

+0

啊,夠公平的。感謝您清理它。 – Nathan 2014-09-22 18:07:28

相關問題