我正在制作一个简单的Random
课程:
class Random
{
public:
static bool seeded = false;
static void SeedRandom( int number )
{
srand(number);
}
static int GetRandom(int low, int high)
{
if ( !seeded )
{
srand ((int)time(NULL));
}
return (rand() % (high - low)) + low;
}
};
显然,C ++不允许将整个类声明为static
(这使得在C#中这么容易)。我把所有成员都改为static
。还没有static
构造函数,因此我无法初始化bool seeded
,除非我手动调用函数,这违背了目的。我可以使用常规构造函数,我必须在其中创建Random
的实例,我不想这样做。
另外,有没有人知道新的C ++ 0x标准是否允许静态类和/或静态构造函数?
答案 0 :(得分:7)
c ++不允许将整个类声明为静态
当然可以。
class RandomClass
{
public:
RandomClass()
{
srand(time(0));
}
int NextInt(int high, int low)
{
return (rand() % (high - low)) + low;
}
}
RandomClass Random; //Global variable "Random" has static storage duration
//C# needs to explicitly allow this somehow because C# does not have global variables,
//which is why it allows applying the static keyword to a class. But this is not C#,
//and we have globals here. ;)
但实际上,没有理由把它放在课堂上。 C ++不会强迫你把所有东西都放在课堂上 - 这是有充分理由的。在C#中,您被迫将所有内容放入一个类中并使用静态方法等来声明事物,但不是意识形态的C ++ 。
你真的不能只使用ideomatic C#代码,并用C ++编写代码,并希望它能很好地工作。它们是非常不同的语言,具有非常不同的要求和编程特征。
如果你想要一种思想的C ++方法,那就不要上课了。在srand
内调用main
,并定义一个能够完成约束的函数:
int RandomInteger(int high, int low)
{
return (std::rand() % (high - low)) + low;
}
编辑:当然,最好使用新的随机数生成工具和uniform_int_distribution
来获取钳制范围,而不是rand
。请参阅rand()
considered harmful。
答案 1 :(得分:2)
无论如何,您的static bool seeded
都需要在cpp文件中定义,并且必须在那里初始化。
bool Random::seeded = false;
答案 2 :(得分:1)
你不必在C ++中把所有东西都变成一个类。
namespace Random
{
bool seeded = false;
void SeedRandom(int number)
{ srand(number); }
int GetRandom(int low, int high)
{
if (!seeded)
{ srand((int)time(NULL)); }
return (rand() % (high - low)) + low;
}
}
答案 3 :(得分:0)
试试这个:
class Random
{
public:
static bool seeded;
static void SeedRandom(int number)
{
srand(number);
seeded = true;
}
static int GetRandom(int low, int high)
{
if (!seeded)
SeedRandom(time(0));
return (rand() % (high - low)) + low;
}
};
bool Random::seeded;
默认情况下, static
bool
初始化为false
,因此无需明确说明。请注意,您的实际类逻辑也是错误的,因为您从未将seeded
设置为true
。
答案 4 :(得分:0)
您可以使用单例模式处理此问题,方法是将构造函数设为私有,并为对象提供静态访问器。
class Random
{
public:
static Random& instance()
{
static Random instance;
return instance;
}
// your other functions here
private:
Random()
{
// your seed code here
}
};
这将确保您只有一个类的实例,并且只要您需要随机,您只需要调用Random :: instance()。function()
答案 5 :(得分:0)
你有一个静态方法的类是什么原因?可能有一个替代方案来实现您的目标。你在寻找与单身人士相似的东西吗?
顺便说一句,如果你的类声明中有静态成员变量,正如我之前的其他答案所指出的那样,你必须在使用它们之前在类之外初始化它们(最好是在cpp文件中)。因此,如果你按照这个并初始化你喜欢这个:
bool Random::seeded = false
它会自动初始化为假。