C++ C++;生成错误:尚未声明对象变量 您可能忘记了在使用problemclass的文件中包含problemclass.h 您可能在ProblemClass自己的头文件中或在您使用它的地方拼错了它的名称。这可以是 很难发现是否是大写错误,例如书写 Problemclass或Problemclass代替Problemclass 您可以将包含保护定义从一个头文件复制粘贴到另一个头文件,然后忘记更改定义的名称。 然后,只有这两个包含的头文件中的第一个需要 效果 您可以将ProblemClass放在命名空间a中,在这种情况下,如果您正在引用ProblemClass,则必须将ProblemClass引用为::ProblemClass 从名称空间A之外对其进行访问 您可能正在使用模板,而不希望两阶段查找能够像它那样工作 您可能在include中拼错了文件名。如果您还有一个旧的 拼写错误的名称下该文件的版本 您可以使ProblemClass成为一个宏,只有在包含ProblemClass.h之后才能定义它,在这种情况下,您将看到 ProblemClass被宏替换为其他对象 预处理器 您可以在ProblemClass.h以外的头文件中定义ProblemClass,然后ProblemClass.h实际上定义了一些东西 否则
上述内容取自另一个类似问题,我发现这些要点很有用,但没有一点真正解决了我的问题,如下所述: 我正在为机器人创建一个自然语言处理器,为软件提供各种对象来表示其环境中的真实世界项目(现在是Blocks world),Block中定义的对象之一:C++ C++;生成错误:尚未声明对象变量 您可能忘记了在使用problemclass的文件中包含problemclass.h 您可能在ProblemClass自己的头文件中或在您使用它的地方拼错了它的名称。这可以是 很难发现是否是大写错误,例如书写 Problemclass或Problemclass代替Problemclass 您可以将包含保护定义从一个头文件复制粘贴到另一个头文件,然后忘记更改定义的名称。 然后,只有这两个包含的头文件中的第一个需要 效果 您可以将ProblemClass放在命名空间a中,在这种情况下,如果您正在引用ProblemClass,则必须将ProblemClass引用为::ProblemClass 从名称空间A之外对其进行访问 您可能正在使用模板,而不希望两阶段查找能够像它那样工作 您可能在include中拼错了文件名。如果您还有一个旧的 拼写错误的名称下该文件的版本 您可以使ProblemClass成为一个宏,只有在包含ProblemClass.h之后才能定义它,在这种情况下,您将看到 ProblemClass被宏替换为其他对象 预处理器 您可以在ProblemClass.h以外的头文件中定义ProblemClass,然后ProblemClass.h实际上定义了一些东西 否则,c++,object,types,C++,Object,Types,上述内容取自另一个类似问题,我发现这些要点很有用,但没有一点真正解决了我的问题,如下所述: 我正在为机器人创建一个自然语言处理器,为软件提供各种对象来表示其环境中的真实世界项目(现在是Blocks world),Block中定义的对象之一: /* * Block.h * * Created on: 11 Mar 2015 * Author: Edward */ #ifndef BLOCK_HPP_ #define BLOCK_HPP_ #include "typ
/*
* Block.h
*
* Created on: 11 Mar 2015
* Author: Edward
*/
#ifndef BLOCK_HPP_
#define BLOCK_HPP_
#include "typedefinitions.h"
#include "dynamixel.h"
#include "BasicRobotFunctions.hpp"
class Block {
public:
bool grounded;
//TODO position is a deprecated variable, replace with distance from
//pos position;
int number;
int distance;
int object_brightness;
Block(BasicRobotFunctions basic);
virtual ~Block();
void setBrightness(int brightness);
void setGrounded(bool ground);
//void setPosition(int x, int y);
void setDistance(int number);
void setNumber(int number);
//pos getPosition();
int getNumber();
int getDistance();
bool getGrounded();
int getBrightness();
int lookAround(BasicRobotFunctions basic);
};
#endif /* BLOCK_H_ */
使用源文件:
/*
* Block.cpp
*
* Created on: 11 Mar 2015
* Author: Edward
*/
#include "Block.hpp"
#define DEFAULT_PORTNUM 3 // COM3
#define DEFAULT_BAUDNUM 1 // 1Mbps
Block::Block(BasicRobotFunctions basic) {
grounded = false;
number = Block::lookAround(basic);
}
Block::~Block() {}
void Block::setGrounded(bool ground){
grounded = ground;
}
/*
void Block::setPosition(int x, int y){
position.x = x;
position.y = y;
}*/
void Block::setDistance(int dist){
distance = dist;
}
void Block::setNumber(int num){
number = num;
}
bool Block::getGrounded(){
return grounded;
}
/*
pos Block::getPosition(){
return position;
}*/
int Block::getNumber(){
return number;
}
int Block::getDistance(){
return distance;
}
int Block::getBrightness(){
return object_brightness;
}
//TODO Arrange function to incorporate Turn() in BasicRobotFunctions
int Block::lookAround(BasicRobotFunctions basic){
int num = 0;
dxl_initialize(DEFAULT_PORTNUM,DEFAULT_BAUDNUM);
for(int i = 0;i<360;i++){
dxl_write_word(11,32,-255);
dxl_write_word(11,30,200);
basic.Step(1);
dxl_write_word(11,32,255);
dxl_write_word(11,30,100);
if(dxl_read_byte(100,32) >= dxl_read_byte(100,52)){
num++;
}
}
dxl_terminate();
return num;
}
void Block::setBrightness(int bright){
object_brightness = bright;
}
在检查了使用对象作为变量的其他类之后,我得到了相同的错误。
针对报价中的要点:
-包括BasicRobotFunctions.hpp
-类名在提到它的所有不同实例中拼写相同
-我没有复制粘贴任何包含保护
-我在项目中没有使用任何名称空间
-我也没有使用任何模板
-文件名在“我的包含”中没有拼写错误
-我还没有在程序中定义任何宏
-我确保每个类都在自己的头文件中定义
我的系统是否存在任何其他问题、我犯的任何错误或我正在做的任何事情都是不好的编程实践?问题的原因:
存在头文件循环依赖关系问题
main.cpp
包括BasicRobotFunctions.hpp
其中包括
Robot.hpp
其中包括
Block.hpp
其中包括
基本CrobotFunctions.hpp
//...
#include "typedefinitions.h"
#include "dynamixel.h"
class BasicRobotFunctions; // Forward declaration
//...
Block(const BasicRobotFunctions &basic);
//...
int lookAround(const BasicRobotFunctions &basic);
//...
如果您的头文件被正确地保护以防多个包(看起来它们是),则<代码> Boo.Hpp不会看到<代码> Basic RooptCuffic的定义。HPP因为它已经在包含它的中间。
如何发现问题: 此问题的根源在编译错误消息和
Block.hpp
文件中显而易见
编译器在Block.hpp
中报告了一个错误,并逐行描述了它是如何通过内含物到达该文件的。Block.hpp
文件的源代码清楚地表明它试图包含BasicRobotFunctions.hpp
//...
#include "typedefinitions.h"
#include "dynamixel.h"
class BasicRobotFunctions; // Forward declaration
//...
Block(const BasicRobotFunctions &basic);
//...
int lookAround(const BasicRobotFunctions &basic);
//...
修复方法: 在本例中,您可以在
Block.hpp
中修改方法签名,以使用对BasicRobotFunctions
类型的引用(可能是常量),然后向前声明该类型。这允许您消除对BasicRobotFunctions.hpp
头文件的依赖。(Block.cpp
可能需要同时包含Block.hpp
和BasicRobotFunctions.hpp
)
通过最小化允许头文件编译所需的头文件,将来可能可以避免此问题。这意味着您的头文件应该:
- 对使用的类型使用前向声明
- 使用引用转发声明的类型
// Foo.cpp
#include "Foo.hpp"
//...
你可以在上课前提出一个声明
类基本函数;
类块{
公众:
布尔接地;
//TODO位置是一个…
但这种错误意味着#包含“BasicRobotFunctions.hpp”
不要声明BasicRobot函数。代码保护可能有问题吗?
循环包含可以使用转发声明来解决,在标题中放置正确的保护,并将一些包含移动到源文件中。请显示您的BasicRobotFunctions.hpp。问题可能在那里(可能包括递归)。您有循环包含(由错误片段确认)。正在查找正确的副本。您已经找到了答案正确的问题,但是您没有阅读第一个答案。请查看并感谢!我通过将调用BasicRobotFunctions的函数从块移动到BasicRobotFunctions中修复了错误:)