访问朋友 class 中的受保护方法时出现问题
problem with accesing protected methods in friend class
我正在开始一个新项目,但在访问 World
class 中 Organism
的受保护方法时遇到问题。我想我对 World
是 organism
的朋友的定义一定有错误。我尝试从 World 中的 Organism 调用一些方法,但编译器说它不可访问。该方法当然被设置为受保护的,因此只有派生的 classes 和朋友可以调用它们。
World.h:
#include <vector>
#include <iostream>
using std::vector;
#include <map>
using std::map;
#include "Organism.h"
#pragma once
class World
{
private:
map<int, std::shared_ptr<Organism>> organims_map;
vector <std::shared_ptr<Organism>> animals_vector;
int x_size, y_size;
void initiate_aniamals();
public:
World();
World(int x, int y);
void make_turn();
};
Organism.h:
#pragma once
#include "World.h"
class Organism
{
friend class World;
private:
int strength, vigor;
int x_pos, y_pos;
float level;
protected:
int get_vigor() const;
virtual void action() = 0 ;
virtual void collision() = 0;
/// <summary>
/// compares animals by their vigor
/// </summary>
/// <param name="other organism"></param>
/// <returns>which animal has higher vigor</returns>
bool operator<(const Organism& other_organism);
};
然后在文件 world.cpp 中我尝试定义方法 make_turn():
void World::make_turn()
{
//stable sort animals by their vigor
std::stable_sort(begin(this->animals_vector), end(this->animals_vector),
[](const Organism& organism_1, const Organism& organism_2)
{
return organism_1.get_vigor(); //
});
我在行中遇到错误:
return organism_1.get_vigor();
表示无法访问函数 get_vigor。
问题在于 #pragma once
不是在 World.h
的开头,而是在包含 Organism.h
之后。这会导致大量奇怪的错误,包括尽管 Organism
是朋友,但 World
无法使用其私有方法。
这是正确的:
#pragma once
#include "Organism.h"
然而这绝对不是:
#include "Organism.h"
#pragma once
我正在开始一个新项目,但在访问 World
class 中 Organism
的受保护方法时遇到问题。我想我对 World
是 organism
的朋友的定义一定有错误。我尝试从 World 中的 Organism 调用一些方法,但编译器说它不可访问。该方法当然被设置为受保护的,因此只有派生的 classes 和朋友可以调用它们。
World.h:
#include <vector>
#include <iostream>
using std::vector;
#include <map>
using std::map;
#include "Organism.h"
#pragma once
class World
{
private:
map<int, std::shared_ptr<Organism>> organims_map;
vector <std::shared_ptr<Organism>> animals_vector;
int x_size, y_size;
void initiate_aniamals();
public:
World();
World(int x, int y);
void make_turn();
};
Organism.h:
#pragma once
#include "World.h"
class Organism
{
friend class World;
private:
int strength, vigor;
int x_pos, y_pos;
float level;
protected:
int get_vigor() const;
virtual void action() = 0 ;
virtual void collision() = 0;
/// <summary>
/// compares animals by their vigor
/// </summary>
/// <param name="other organism"></param>
/// <returns>which animal has higher vigor</returns>
bool operator<(const Organism& other_organism);
};
然后在文件 world.cpp 中我尝试定义方法 make_turn():
void World::make_turn()
{
//stable sort animals by their vigor
std::stable_sort(begin(this->animals_vector), end(this->animals_vector),
[](const Organism& organism_1, const Organism& organism_2)
{
return organism_1.get_vigor(); //
});
我在行中遇到错误:
return organism_1.get_vigor();
表示无法访问函数 get_vigor。
问题在于 #pragma once
不是在 World.h
的开头,而是在包含 Organism.h
之后。这会导致大量奇怪的错误,包括尽管 Organism
是朋友,但 World
无法使用其私有方法。
这是正确的:
#pragma once
#include "Organism.h"
然而这绝对不是:
#include "Organism.h"
#pragma once