2014-09-22 72 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