编辑: 感谢您指出我在循环依赖的正确方向。我尝试从 Mathfg.h 中删除 #include“datastructure.h”,并在“Matfg.h”中添加了“Class ArithmeticTree”来转发声明它,但是我在CleanExpression函数中得到另一个错误:
无法将'std :: __ cxx11 :: basic_string :: iterator {aka __gnu_cxx :: __ normal_iterator>}'转换为'const char *'以将参数'1'转换为'int remove(const char *) “的。当我将鼠标悬停在“删除”一词上时,Qt告诉我“有太多的争论”。这是在Calculator :: CleanExpression包含的一行代码中。
我正在编写一个数学解析器,我创建了一个头文件 Mathfg ,其中包含一个处理输入的 Calculator 类。到目前为止,我有一个名为 CleanExpression 的静态函数,它只是从输入字符串中删除空格。
我在这里看到了一个类似的问题:Static function declared but not defined in C++,但我无法将答案应用于我自己的问题。
(我省略了不相关的部分,例如 Node 结构的实现,但除了 CleanExpression 调用之外,它都有效。)
#ifndef MATHFG_H
#define MATHFG_H
#include <string>
#include "datastructure.h"
using namespace std;
class Mathfg
{
private:
Mathfg();
};
class Calculator
{
private:
Calculator();
public:
static void CleanExpression(string& expression)
{
expression.erase(remove(expression.begin(), expression.end(), ' '), expression.end());
}
};
#endif // MATHFG_H
注意:我没有使用Mathfg.h的源文件。
在另一个标题“Datastructure.h”中,我修复输入并产生输出。我想从“Mathfg.h”调用静态函数 CleanExpression ,但是我收到错误:'计算器'尚未声明。
#ifndef DATASTRUCTURE_H
#define DATASTRUCTURE_H
#include <iostream>
#include <string>
#include "mfg\mathfg.h"
using namespace std;
struct ArithmeticTree
{
private:
struct Node
{
// Doing some unrelated stuff here
};
public:
ArithmeticTree()
{
}
ArithmeticTree(string expression_in)
{
Calculator::CleanExpression(expression_in); // <- Here's the problem!
// Doing some unrelated stuff here
}
// Doing some unrelated stuff here
};
#endif // DATASTRUCTURE_H
注意:我不使用Datastructure.h的源文件。
在我的游戏循环中,我可以成功运行此代码:
std::string str = "2 +3-4 / 5";
cout << "Cleaning string:\t'" << str << "'\n";
Calculator::CleanExpression(str);
cout << "Cleaned:\t\t'" << str << "'\n";
......输出:
Cleaning string: '2 +3-4 / 5'
Cleaned: '2+3-4/5'
...但是当我尝试从“Datastructure.h”中调用 Calculator :: CleanExpression 时 - 或者更具体地说,从 ArithmeticTree 我>的构造函数 - 我得到上述错误。我从来没有在我的代码中的任何地方创建过计算器或 Mathfg 对象;我只是把它的静态函数称为我通常期望的行为。
我确信我误解了静态函数在C ++中是如何工作的,这可能也是我错误的原因。
我真的想要一些关于如何解决这个问题的技巧!
我正在使用 Qt Creator 4.2.1 和 MinGW 5.3.0 32bit2 。