我正在尝试创建一个类,该类的私有成员必须访问在同一类中通过公共访问定义的结构。我正在使用VS Code编写代码。当我尝试编写私有成员函数时,它说未定义结构标识符。
class Planner
{
private:
typedef std::pair<int, int> location;
std::vector<location> obstacles;
Pose next_state(const Pose& current_state, const Command& command);
public:
Planner(/* args */);
virtual ~Planner();
/* data */
struct Command
{
unsigned char direction;
unsigned char steering;
};
struct Pose
{
int x;
int y;
int theta;
};
struct Node
{
Pose pose;
int f;
int g;
int h;
};
};
在这里,它说“标识符“姿势”未定义”。我想了解这里发生了什么。
答案 0 :(得分:4)
在这里,它说“标识符“姿势”未定义”。我想了解这里发生了什么。
那是因为您在编译器可以在Pose
部分看到它们之前引入了Command
和private
类型引用:
private:
// ...
Pose next_state(const Pose& current_state, const Command& command);
// ^^^^ ^^^^^^^
编译器在使用前需要查看标识符。
解决方法是在Planner
类中需要正确排序的前向声明:
class Planner {
// <region> The following stuff in the public access section,
// otherwise an error about "redeclared with different access" will occur.
public:
struct Pose;
struct Command;
// </region>
private:
typedef std::pair<int, int> location;
std::vector<location> obstacles;
Pose next_state(const Pose& current_state, const Command& command);
public:
Planner(/* args */);
virtual ~Planner();
/* data */
struct Command {
unsigned char direction;
unsigned char steering;
};
struct Pose {
int x;
int y;
int theta;
};
struct Node {
Pose pose;
int f;
int g;
int h;
};
};
请参见working code。
另一种选择是按照@2785528's answer中所述重新排列public
和private
部分 1 。
1) 请注意,这些可以在类声明中多次提供。
答案 1 :(得分:2)
还请考虑:您可以稍微重新排列代码,而无需添加行。
class Planner
{
private:
typedef std::pair<int, int> location;
std::vector<location> obstacles;
// "next_state" private method moved below
public:
Planner(/* args */){};
virtual ~Planner(){};
/* data */
struct Command
{
unsigned char direction;
unsigned char steering;
};
struct Pose
{
int x;
int y;
int theta;
};
struct Node
{
Pose pose;
int f;
int g;
int h;
};
private:
Pose next_state(const Pose& current_state, const Command& command);
};
您可能有多个私人部分。
此外,您可以考虑在类声明的末尾将所有私有属性移到一起。
答案 2 :(得分:0)
文件按顺序解析。在定义姿势之前,您要先参考姿势。您可以使用成员函数和变量来执行此操作,但这是例外,而不是规则。
要解决此问题,一种简单的方法是将私有部分移到末尾。