【问题标题】:Getting 'undeclared identifier' when using vector of type class使用类型类的向量时获取“未声明的标识符”
【发布时间】:2020-01-13 23:08:47
【问题描述】:

当我确保包含具有我正在制作向量的类的声明的头文件时,我无法理解为什么会收到“未声明的标识符”错误。

#pragma once
#include <vector>
#include "Member.h"

class Party {
private:
    std::vector<Member> members;

public:
    Party();
    int get_party_size();
    void add_member(Member new_member);
    Member& get_member(int num);

};

这里是“会员.h”

#pragma once
#include <vector>
#include <string>
#include "Party.h"

class Member
{
private:
    int hp;
    bool is_stunned;
    bool is_alive;

public:
    Member();
    ~Member();
    int get_hp();
    bool get_is_stunned();
    bool get_is_alive();
    void take_damage(int amt);
    void stun();

    virtual void turn(std::vector<Party>& parties, int my_party, int my_member_number);
    virtual std::string get_class_name();

};

对这门语言还很陌生,所以我肯定遗漏了一些明显的东西。

【问题讨论】:

  • member.h 长什么样子?
  • 我猜Member.h 包含Party.h 并且你有一个循环依赖。
  • @Someprogrammerdude 猜得好! :)
  • 解决问题的方法是打破循环包含依赖。这通常通过类的前向声明来完成。
  • @Anders 以前见过很多次... :)

标签: c++ object vector member undeclared-identifier


【解决方案1】:

您在会员和政党之间存在循环依赖

删除线

virtual void turn(
  std::vector<Party>& parties, 
  int my_party, 
  int my_member_number);

在 Member 中并删除 Member.h 中的 #include "Party.h"

相反地认为,Party 只是成员的集合,因此单个成员无需了解容器

因此,在 @some-programmer-dude 输入后,您还可以通过在 Member.h 中添加前向声明而不是包含 Party.h 来解决它

class Party;

class Member { ... }

【讨论】:

  • 您说需要删除的函数声明实际上不需要删除。该行本身并不依赖于 Party 类的完整定义,它所需要的只是一个前向声明。
  • 是的,你是对的,但我是从设计的角度来看的,恕我直言,如果成员对党没有依赖关系会更好。但是,嘿,我知道他需要什么:)
猜你喜欢
  • 2014-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-08
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
相关资源
最近更新 更多