C++ 从主目录访问类的受保护成员

C++ 从主目录访问类的受保护成员,c++,arrays,class,private,protected,C++,Arrays,Class,Private,Protected,World.cpp: World::World() { //something } World::~World() { //something } void World::doSomething(Organism *organisms[20][20]) { cout << organisms[1][1]->Key(); // example of what I need to do here } int main() { World *world

World.cpp:

World::World() {
    //something
}
World::~World() {
    //something
}
void World::doSomething(Organism *organisms[20][20]) {
    cout << organisms[1][1]->Key(); // example of what I need to do here
}
int main() {
    World *world = new World();
    World::doSomething(world->organisms);
    return 0;
}
有机物

Organism::Organism(){
}
Organism::~Organism(){
}
char Organism::Key(){
    return this->key;
}
有机体

class Organism {
public:
    Organism();
    ~Organism();
    // ...
    char Key();
protected:
    char key;
    // ...
};
我需要做一些像机器一样的东西,创造动物。上面的代码工作得非常好,让您知道:数组生物体是指向类型生物体的特定生物体的指针数组,每个生物体都包含它的char键值。 我的问题是,我需要让有机体*有机体数组受到保护或是私有的,而不是公共的。问题开始了

我有一个错误,无法使用doSomething(下划线)访问文件World.cpp行中在World中声明的受保护成员

我试着使用friend等,但没有一种方法奏效。知道如何从main访问此阵列吗?(功能参数可以更改,阵列需要保护/专用)有什么简单的方法可以做到这一点吗


感谢您的帮助

问题在于main()位于全局空间中,而不是类。因此,它不能是拥有私人成员的类的朋友。你最好的办法是让另一个类成为你的类的朋友,并使用该类访问私有成员。

你确实可以让
main
函数成为这样一个类的朋友:

int main(int, char**);

namespace N {
    struct C {
        friend int ::main(int, char**);

    private:
        int privateer = 42;
    };
}

int main(int, char**) {
    ::std::cout << N::C().privateer << "\n";
}
intmain(int,char**);
名称空间N{
结构C{
friend int::main(int,char**);
私人:
int私掠者=42;
};
}
int main(int,char**){

::std::cout当我删除static时,我得到一个错误:非static成员引用必须与特定对象相关有机体是一个抽象类(可能很重要),我以后使用它创建对象(不是直接创建)。然后您当然必须使用对象的
数组
并完全删除参数。我创建了一个新项目,Main.cpp文件,其中包含类Main和构造函数、析构函数和my int Main(上面的剪切格式代码)但是我得到了未解析的外部符号u main,在函数u tmainCRTStartup中引用。我还向World.h(内部世界类)添加了friend类main,你介意给我一个这样的类的例子吗?我是面向对象编程的新手,我可能知道我需要做什么,但我不确定如何做
int main(int, char**);

namespace N {
    struct C {
        friend int ::main(int, char**);

    private:
        int privateer = 42;
    };
}

int main(int, char**) {
    ::std::cout << N::C().privateer << "\n";
}