将代码分解为头文件和实现文件c ++

时间:2015-02-24 21:31:25

标签: c++ xcode header-files

我试图将以下代码分解为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;
}

以下是错误的屏幕截图: enter image description here

2 个答案:

答案 0 :(得分:1)

这里有两点说明:

  1. RandomInteger.h 文件中,您定义了一个随机化器变量,我相信您需要在源文件中执行此操作;
  2. 通过撰写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