无法使用朋友类的方法

时间:2013-12-14 18:19:30

标签: c++

我的代码有问题。我有两个类,Run和Robot,我想要一个Robot类型的对象来更改Run类型的对象的私有成员。具体来说,我想在以下代码中增加'x'的值。

弹出以下错误:

错误:未在此范围内声明'getX' 错误:'getX'未在此范围内声明

我已经用箭头(< ---)确定了发生错误的行。以下代码只是一个测试,只是为了学习如何在项目中使用'friend'关键字。

#include <iostream>
#include <vector>
using namespace std;

class Robot;

class Run{
    friend class Robot;
private:
    int x;
    vector<Robot*>robots;
public:
    Run();
    vector<Robot*>*getRobots();
    void createRobot();
    void movAll();
    void setX(int);
    int getX();
};

class Robot{
    friend class Run;
public:
    Robot();
    void movingRobot();
};

Run::Run(){}

vector<Robot*>*Run::getRobots(){return &robots;}
void Run::createRobot(){getRobots()->push_back(new Robot);setX(1);}
void Run::movAll(){getRobots()->at(0)->movingRobot();}
int Run::getX(){return x;}
void Run::setX(int c){x=c;}

Robot::Robot(){}

void Robot::movingRobot(){setX(getX()+1);}    <-------------------------

int main(){
    Run Sim;
    Sim.createRobot();
    Sim.movAll();
}

使用'friend'关键字肯定对我的项目有所帮助,所以我想了解如何使用它。

3 个答案:

答案 0 :(得分:1)

您只是致电getX()setX(),就像他们是Robot的方法一样。您需要针对Run的实例调用该函数,在这种情况下,您不需要它成为朋友,因为getX()无论如何都是公共的。

那就是说,你想让每个机器人都有一个你要增加的x值吗?在这种情况下,您需要它成为Robot的成员而不是Run。

如果您希望Run具有单个值x以便Robot的所有实例都可以访问和修改,那么只需将x设为静态,然后直接访问它而不是调用公共方法,无论如何都不需要另一个班级成为朋友。

答案 1 :(得分:0)

您将getX称为机器人类的功能。你需要一个运行对象来调用它:

run.getX()

答案 2 :(得分:0)

好的,你可以从getX()类删除Robot函数,因为它目前还没有代码体,对于内部使用,机器人类总是可以利用它的X变量。 Run不需要friend class Robot,因为机器人不需要查看任何内容Run,因为Run包含指向{的实例的指针向量{1}}它可以通过查看其向量的内容来访问Robot个实例的任何值(例如Robot将返回机器人向量中第二个机器人的x值。)

现在,myRunInstance.getRobots()[1]->getX()函数必须保持不变,如果要保留在getX类中:您需要指定一种方法来使其收集特定实例的信息Run类,大概来自它的机器人矢量。我已经重新调整了上面的代码并在主要部分添加了一个小概念代码验证集,让10个机器人使用moveall将它们全部移动,然后将Johnny5设置为一个特殊的地方(因为他很特别:)有些东西:< / p>

Robot

来源也可通过Ideone

的样本输出查看