在另一个类c ++中调用成员函数

Posted

技术标签:

【中文标题】在另一个类c ++中调用成员函数【英文标题】:call member function in another class c++ 【发布时间】:2016-08-26 22:46:45 【问题描述】:

我有一个名为 Ball 的类和一个 Player 类。在我的 Ball 类中,我创建了两个 Player 类型的指针,并且我有两个成员方法,因此当我更改球时,我可以指向不同的球员(当前和以前的球员)。所以我知道,如果我想在 Player 类的方法中调用 Ball 的成员方法,它们必须是静态的(而且我也认为静态方法也可以使用静态变量)但我似乎有很大的困难,无论我尝试什么我得到一个不同的错误。

以下是 Player.h

#ifndef PLAYER_H
#define PLAYER_H
#include <iostream>
#include "Player.h"

using namespace std;

class Player

    public:
        //constructor of players
        Player(const string &,int,int,int,int); //name,num,x,y,target_line

        //setters and getters
        //player's movements and functions
        void pass(Player*);

    private:
        string Name;
        int Num;
        int X;//0-5
        int Y;//0-9
        int Movement_line;
        int Target_line;

;

#endif // PLAYER_H

下面是Player.cpp,其中在方法传递中出现了我描述的问题。

#include "Player.h"
#include <stdio.h>
#include <iostream>
#include "Team.h"
#include "Ball.h"
#include <cstdlib>

using namespace std;


Player::Player(const string &name,int num,int x,int y,int target_line)
:   Name(name),
    Num(num),
    X(x),
    Y(y),
    Movement_line(y),
    Target_line(target_line)



//setters and getters and other member functions

void Player::pass(Player* next)
    changeCurrentToPrevious();
    changeNextToCurrent(next);

下面是Ball.h

#ifndef BALL_H
#define BALL_H
#include "Player.h"

class Ball

    public:
        Ball();
        Player* current;
        Player* previous;

        /*void setX_ball(int);
        int getX_ball() const;
        void setY_ball(int);
        int getY_ball() const;
        void assign();*/
        static void changeCurrentToPrevious();
        static void changeNextToCurrent(Player*);


    private:
        int X_ball;
        int Y_ball;
;

#endif // BALL_H

以下是Ball.cpp

#include "Ball.h"
#include "Team.h"
#include "Player.h"

Ball::Ball()
:   X_ball(2),
    Y_ball(5)

    current = NULL;
    previous = NULL;



static void Ball::changeCurrentToPrevious()//when pass occurs
    previous = current ;


static void Ball::changeNextToCurrent(Player* next)
    current = next;

【问题讨论】:

一小时前提出了完全相同的问题。那个是怎么回事? 要调用另一个类中的静态方法,必须在其前面加上类名:Ball::changeCurrentToPrevious(); 所以我知道,如果我想在 Player 类的方法中调用 Ball 的成员方法,它们必须是静态的。 你为什么这么认为?如果Player 类中有BallBall* 类型的变量,则可以调用常规方法。 大家感谢您的回答。请注意,我刚刚接触 C++,这是我的第一个项目,我可能会说错话。感谢您的回复,我非常感谢。 【参考方案1】:

如果要调用另一个类的静态方法,需要:

void Player::pass(Player* next)
    Ball::changeCurrentToPrevious();
    Ball::changeNextToCurrent(next);

要么这样,要么你在 Player 中存储一个指针/引用到球,然后你可以通过它调用。

【讨论】:

感谢您的帮助。一个额外的问题是否同样适用于从类到类的静态变量? 我现在听从了你的建议,我似乎还有另一个问题。我将 Player* current 和 Player* previous 声明为静态变量,但现在在 Ball (Ball.cpp) 的构造函数中,它表示对当前和上一个的未定义引用 看,当你确定你只需要静态的东西时,你只需要其中一个,不管你有多少对象。我不相信这是这种情况。也许你想要一个指针/引用(而不是静态)。 是的,我现在意识到了。只是我是 C++ 新手,所以我不是那么多才多艺【参考方案2】:

当然,如果你创建了一个public 方法static,那么你可以在任何地方用 ClassX::methodY() 调用它,但是随后面向对象就消失了,你实际上是在 @ 中编写代码987654323@,不在C++

当然不是,静态方法不能神奇地访问实例的成员变量。

所以,方法不能是静态的;它们必须是非静态(“实例”)方法。

这意味着要调用它们,您必须引用Ball。这反过来意味着Ball 引用Players 是不够的;每个Player 还必须有对Ball 的引用。

【讨论】:

我认为这将解决问题。我必须改变处理问题的方式。感谢您的回答。

以上是关于在另一个类c ++中调用成员函数的主要内容,如果未能解决你的问题,请参考以下文章

试图在另一个类函数中使用成员类函数

在另一个成员函数中调用成员函数时,在“int”之前的预期主表达式

如何在线程中调用其他类的成员函数和变量

C++类静态成员函数调用错误

在同一个类的另一个成员函数的定义中调用一个类成员函数

C ++从不同的函数中分配类成员的值