在另一个类中调用一个类函数

时间:2016-02-23 04:31:09

标签: c++ class

我上课时遇到麻烦。我有一个生成随机数的类,我想在另一个类中使用这个随机数生成器来创建一个Powerball模拟器。

这是随机数生成器的.cpp文件:

#include "RandomNumber.h"

#include <random>
#include <utility>

using namespace std;

RandomNumber::RandomNumber( int min, int max,
                           bool minInclusive, bool maxInclusive )
: mMinimum( min ), mMaximum( max )
{
    if (mMinimum > mMaximum)
    {
        swap( mMinimum, mMaximum );
    }
    if (!minInclusive)
    {
        mMinimum++;
    }
    if (!maxInclusive)
    {
        mMaximum--;
    }
}

int RandomNumber::random( )
{
    static random_device rd;
    static mt19937 generator(rd());
    uniform_int_distribution<> distro( mMinimum, mMaximum );

    return( distro( generator ) );
}

这是随机数生成器的头文件:

#ifndef RandomNumber_h
#define RandomNumber_h


#include <stdio.h>


class RandomNumber
{
public:
    RandomNumber( int min, int max, bool minInclusive = true, bool maxInclusive= true );

    // supply a number between min and max inclusive
    int random( );
private:
    int  mMinimum, mMaximum;
};

#endif /* RandomNumbers_h */

我想在名为PowerballLottery的另一个类中调用成员函数,如果它们在适当的范围内,则存储6个值,我尝试使用

RandomNumber.random( 1, 69 )

RandomNumber::random( 1, 69 )

但都没有奏效。我想知道什么是正确的语法。 非常感谢你阅读这篇文章。

5 个答案:

答案 0 :(得分:2)

要访问成员函数,您需要实例化该类。

RandomNumber randNum(1, 69);
int newRandomNumber = randNum.random();

答案 1 :(得分:1)

random函数的函数签名是:

int RandomNumber::random();

返回int并且不接受任何参数。因此,调用random(1, 69)是错误的。

此外,random功能不是static。因此,调用RandomNumber::random(1, 69)是错误的(也因为它不接受任何参数)。

为了调用random函数,您需要实例化一个对象,然后使用对象实例调用该函数。例如:

RandomNumber prng(1, 69);
prng.random();

答案 2 :(得分:0)

RandomNumber是类的名称,而不是实例,random是非静态成员函数。要按原样调用random,您必须创建RandomNumber的实例。

RandomNumber rn(/*...args...*/);
rn.random();

//or

RandomNumber(/*...args...*/).random();

您可以改为使random成为静态成员函数(或者根本不是成员),而是将构造函数参数作为参数。

答案 3 :(得分:0)

另外,不要忘记添加

#include "RandomNumber.h"

到PowerBall.cpp的顶部。否则PowerBall将不知道RandomNumber是什么!

答案 4 :(得分:0)

您的问题是,random()RandomNumber的成员函数,因此只有在实例化该类的实例时才能调用它,使用构造函数创建实际对象。如果你真的不需要该类的特定实例(看起来你不是这样),你可以使该函数保持静态:

static int random();

这样就可以通过使用Random.h从其他类或主代码中调用它(只要包含RandomNumber::random()),因为静态成员函数不依赖于类的特定实例。见http://en.cppreference.com/w/cpp/language/static

本质上,静态不具有隐式参数this,这是指向调用常规成员函数的对象实例的指针:

x.useSomeMethod(); // then inside the call of useSomeMethod(), *this == x

但是,对于您的应用程序,RandomNumber类似乎根本不需要它自己的类。如果要在PowerballTicket中使用它,但不能将其用于使用该类的代码,则可以执行的操作是使random()成为私有成员函数PowerballTicket,这也可以是静态的,因为(我假设)它并不关心它内部使用的PowerballTicket实例:

class PowerballTicket{
public:
    PowerballTicket(int x1, int x2, int x3, int x4, int x5, int x6);
    int getBall1();
    int getBall2();
    int getBall3();
    int getBall4();
    int getBall5();
    int getPowerball();
private:
    static int random(int min, int max, bool minInclusive = true, bool maxInclusive = true);
    int mBall1;
    int mBall2;
    int mBall3;
    int mBall4;
    int mBall5;
    int mPowerball;
};

但我不确定您实际上计划从您提供的代码中调用random(),因此您可能需要根据需要对其进行修改。