我正在使用 comp4300 学习 C++ 和游戏设计。在课程的作业 2 中,讲师使用
friend
类来访问 entity
类,但我无法执行此操作,并且收到错误:
entity::entity 无法访问类“Entity”中声明的私有成员
实体.h
#pragma once
#include "component.h"
#include <memory>
#include <string>
class Entity
{
friend class EntityManager;
private:
bool m_active = true;
size_t m_id = 0;
std::string m_tag = "Default";
Entity(const size_t id, const std::string& tag);
public:
std::shared_ptr<CTransform> cTransform;
std::shared_ptr<CShape> cShape;
std::shared_ptr<CCollision> cCollision;
std::shared_ptr<CScore> cScore;
std::shared_ptr<CLifespan> cLifespan;
std::shared_ptr<CInput> cInput;
bool isActive() const;
const std::string& tag() const;
const size_t id() const;
void destroy();
};
EntityManager.h
#pragma once
#include "entity.h"
#include <vector>
#include <map>
typedef std::vector<std::shared_ptr<Entity> > EntityVec;
typedef std::map<std::string, EntityVec> EntityMap;
class EntityManager
{
EntityVec m_entities;
EntityMap m_entityMap;
EntityVec m_toAdd;
size_t m_totalEntities{ 0 };
public:
EntityManager();
std::shared_ptr<Entity> addEntity(const std::string& tag);
void update();
EntityVec& getEntities();
EntityVec& getEntities(std::string& tag);
};
EntityManager.cpp
#include "entitymanager.h"
EntityManager::EntityManager()
:m_totalEntities(0)
{
}
std::shared_ptr<Entity> EntityManager::addEntity(const std::string& tag)
{
auto e = std::make_shared<Entity>(m_totalEntities++, tag);
m_toAdd.push_back(e);
return e;
}
我尝试了一切,但就是不行。
EntityManager
不是试图直接访问私有 Entity
构造函数的人。 std::make_shared()
就是这个,所以需要将其改为 friend
。