我上课时遇到麻烦。我有一个生成随机数的类,我想在另一个类中使用这个随机数生成器来创建一个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 )
但都没有奏效。我想知道什么是正确的语法。 非常感谢你阅读这篇文章。
答案 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()
,因此您可能需要根据需要对其进行修改。