【问题标题】:Accessing protected members of class from main从主访问类的受保护成员
【发布时间】:2014-06-07 13:08:52
【问题描述】:

世界.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;
}

世界.h

class World {
public:
    static void doSomething(Organism *organisms[20][20]);
    World();
    ~World();
    Organism *organisms[20][20];
};

有机体.cpp

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

有机体.h

class Organism {
public:
    Organism();
    ~Organism();
    // ...
    char Key();
protected:
    char key;
    // ...
};

我需要制造类似机器的东西,创造动物。上面的代码效果很好,让你知道:数组有机体是一个指向有机体类型的特定有机体的指针数组,每个有机体都包含它的 char 键值。 我的问题是我需要将 Organism *organisms 数组设为受保护或私有而不是公开。然后开始出现问题。

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

我尝试使用朋友等,但没有一种方法奏效。知道如何从 main 访问这个数组吗? (函数参数可以更改,数组需要保护/私有)有什么简单的方法可以做到这一点吗?

感谢您的帮助

【问题讨论】:

    标签: c++ arrays class private protected


    【解决方案1】:

    您确实可以让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";
    }
    

    但是,为什么不直接将doSomething 设为非静态成员函数呢?

    【讨论】:

    • 当我删除 static 我得到一个错误:一个非静态成员引用必须是相对于一个特定的对象有机体是一个抽象类(这可能很重要)被我用来稍后创建对象(不是直接)。
    • 那么你当然必须使用你的对象的organisms数组并完全删除参数
    【解决方案2】:

    问题是 main() 在全局空间中,它不是一个类。所以它不能是具有私人成员的班级的朋友。您最好的选择是创建另一个类,该类将成为您类的朋友,并使用该类访问私有成员。

    【讨论】:

    • 我创建了一个新项目,Main.cpp 文件包含带有构造函数、析构函数和我的 int main 类的 Main(上面可爱的表单代码),但我得到了函数 __tmainCRTStartup 中引用的未解析的外部符号 _main .我还将朋友类 Main 添加到 World.h(在 World 类中)
    • 你介意给我一个这样的类的例子吗?我是面向对象编程的新手,我可能知道我需要做什么,但我不知道该怎么做
    猜你喜欢
    • 2012-12-01
    • 2017-08-01
    • 2016-10-01
    • 2014-06-19
    • 1970-01-01
    • 1970-01-01
    • 2014-08-27
    • 2010-09-16
    相关资源
    最近更新 更多