我试图将以下代码分解为C ++中的单独标头和实现文件:
class randomInteger {
public:
unsigned int operator () (unsigned int);
} randomizer;
unsigned int randomInteger::operator () (unsigned int max)
{
// rand return random integer
// convert to unsigned to make positive
// take remainder to put in range
unsigned int rval = rand();
return rval % max;
}
unsigned int randBetween(int low, int high) {
return low + randomizer(high - low);
}
以下是我分开的内容: RandomInteger.h
#ifndef __EventSimulation__RandomInteger__
#define __EventSimulation__RandomInteger__
#include <iostream>
class RandomInteger {
public:
// MEMBERS
unsigned int operator () (unsigned int);
unsigned int randBetween(int low, int high);
} randomizer;
#endif
RandomInteger.cpp
#include "RandomInteger.h"
unsigned int RandomInteger::operator () (unsigned int max) {
// rand return random integer
// convert to unsigned to make positive
// take remainder to put in range
unsigned int rval = rand();
return rval % max;
}
unsigned int RandomInteger::randBetween(int low, int high) {
return low + RandomInteger(high - low);
}
当我在我的main方法中使用该类进行测试并尝试运行该程序时,我得到一个错误&#34;链接器命令失败,退出代码为1(使用-v查看调用)&#34;使用Xcode。
这是我简单的主要方法:
int main(int argc, const char * argv[])
{
// Test Randomized
// Create a random number between 2 and 4
int randomBeer = randomizer.randBetween(2, 4);
// Switch to print beer
cout << "BeerType: " << randomBeer << endl;
}
以下是错误的屏幕截图:
答案 0 :(得分:1)
这里有两点说明:
RandomInteger(high - low);
,我认为您想要致电operator () (unsigned int)
,而是尝试创建像RandomInteger::RandomInteger(int)
这样的对象。我认为你没有这样的构造函数。否则将不会创建 randomizer 对象(使用默认的没有参数的对象)。答案 1 :(得分:0)
在第一个未分割版本中,您可以同时定义类的类和实例。该类有一个数据成员和一个方法。然后定义一个使用该实例的简单函数randBetween
。
当你分手时,你仍然会创建一个全局实例randomizer
,但这次你使randBetween
成为class RandomInteger
的方法。但是,当您迁移randBetween
时,您会尝试调用您从未定义的构造函数,RandomInteger(int)
。 (它也可能试图寻找类型转换运算符,但不 operator()
。)
因为您要在每个模块中创建该实例,而您在其中包含RandomInteger.h
,所以您将获得屏幕截图中显示的重复符号。
我不完全确定你要在这里完成什么,所以建议“工作”的代码需要一些假设。我不认为这里需要一个类,因为你似乎只是做一个包含几个函数的类,而不是让你想要多次实例化的对象。
我还应该注意,正如您所做的那样,使用%
运算符会为您提供不可预测的结果,但不会提供统计随机结果;分配将是糟糕和可预测的。考虑section 13.16 of the C Programming FAQ中使用的方法,或一些更复杂的答案at this StackOverflow question。