Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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++ 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

上述内容取自另一个类似问题,我发现这些要点很有用,但没有一点真正解决了我的问题,如下所述:

我正在为机器人创建一个自然语言处理器,为软件提供各种对象来表示其环境中的真实世界项目(现在是Blocks world),Block中定义的对象之一:

    /*
 * 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中修复了错误:)