无法访问Friend类的私有构造函数

lha*_*ahn 1 c++ friend

我有以下两个类:

struct Entity 
{
    unsigned id;
    Entity(unsigned id);
    Entity();
};

class EntityManager
{
public:
    Entity create();
    ...

private:
    Entity make_entity(unsigned index, unsigned generation);
};
Run Code Online (Sandbox Code Playgroud)

这个目前工作正常.问题是封装.我不想允许直接创建类Entity.

因此,我的目标是使构造者成为Entity私有的.然后,我可以(从我的理解)十个分量的功能在EntityManager通过使Entity一个friendEntityManager.

因此,进行更改将是结果:

struct Entity 
{
    unsigned id;
private:
    Entity(unsigned id);
    Entity();
};

class EntityManager
{
    friend struct Entity;
public:
    Entity create();

private:
    Entity make_entity(unsigned index, unsigned generation);
};
Run Code Online (Sandbox Code Playgroud)

这打破了代码.我得到的错误就是这个:

entity_manager.cpp: In member function ‘Entity EntityManager::make_entity(unsigned int, unsigned int)’:
entity_manager.cpp:12:1: error: ‘Entity::Entity(unsigned int)’ is private
 Entity::Entity(unsigned id) : id(id) {}
 ^
entity_manager.cpp:19:21: error: within this context
     return Entity(id);
                     ^
Run Code Online (Sandbox Code Playgroud)

实现文件就像这样:

Entity::Entity() : id(0) {}
Entity::Entity(unsigned id) : id(id) {}

Entity EntityManager::make_entity(unsigned idx, unsigned  generation)
{
    unsigned id = 0;
    id = ...
    return Entity(id);
}

Entity EntityManager::create()
{
    ...
    return make_entity(..., ...);
}
Run Code Online (Sandbox Code Playgroud)

我有什么明显的遗失吗?我也尝试过调用Entity(id)实现Entity::Entity(id),但是我又得到了另一个错误:

entity_manager.cpp: In member function ‘Entity EntityManager::make_entity(unsigned int, unsigned int)’:
entity_manager.cpp:19:29: error: cannot call constructor ‘Entity::Entity’ directly [-fpermissive]
     return Entity::Entity(id);

                             ^
entity_manager.cpp:19:29: note: for a function-style cast, remove the redundant ‘::Entity’
entity_manager.cpp:12:1: error: ‘Entity::Entity(unsigned int)’ is private
 Entity::Entity(unsigned id) : id(id) {}
 ^
entity_manager.cpp:19:29: error: within this context
     return Entity::Entity(id);
Run Code Online (Sandbox Code Playgroud)

Ano*_*ail 6

你有friend向后声明.你需要在Entity结构中包含这一行:

friend class EntityManager;
Run Code Online (Sandbox Code Playgroud)