'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?
答案 0 :(得分:15)
应该是world->initPhysics()
,而不是world<-initPhysics()
您的版本被读作表达式“world小于-1乘以全局函数initPhysics()的结果”,它是无法找到的全局函数。
虽然这显然是测试代码,但我只想指出,如果您使用new
分配对象,则必须在某处显式delete
。
答案 1 :(得分:3)
world<-initPhysics()
应为world->initPhysics()
?
答案 2 :(得分:3)
在 ptr 中指向->
中<-
运算符(不是ptr->member
!)作为“成员” “换句话说:它是实际指针的某种文字表示。所以在你的情况下它应该是
world->initPhysics(); // note the ->, not <-
然而,虽然这回答了你的问题,但还远远不够。您的代码还有其他几个问题。
无需先创建未初始化的指针,然后对其进行初始化。这很容易出错,你应该立即初始化它:
testWorld* world = new testWorld();
world->initPhysics();
请注意,在C ++中,使用new
运算符创建的每个对象都需要使用delete
运算符明确销毁:
delete world; // sounds scary, BTW
您似乎来自Java或C#等语言,其中一切都必须new
。在C ++中,这不是真的。默认情况下,您应该在堆栈上创建对象,而不是在堆上创建对象:
testWorld world;
world.initPhysics();
但您的代码仍然存在问题。你现在拥有的是两相结构。作为类的用户,我需要记住在使用它的实例之前调用初始化函数。但这就是构造者的用武之地!构造函数应该完全初始化对象,以使其处于可用状态。您应该从构造函数调用初始化函数:
testWorld() {initPhysics();}
物理学是世界不可分割的一部分,不应该作为事后补充添加。 :)
答案 3 :(得分:0)
您希望world->initPhysics();
代替world<-initPhysics();
答案 4 :(得分:0)
world<-initPhysics();
在这里,你的箭头方向错误。你应该:
world->initPhysics();
答案 5 :(得分:0)