Listing 1. Counting Primes

class CountPrimes {
public:
  CountPrimes(long start_, long stop_);
  long total();
private:
  long start;
  long stop;
  long count;
  bool counted;
  bool is_prime (long candidate);
};

CountPrimes::CountPrimes(long start_, long stop_)
  :start(start_),stop(stop_),count(0),counted(false){
  if (start>=stop)
    throw range_error("Start >= Stop");
}

bool CountPrimes::is_prime (long candidate){
  // special cases
  if (candidate<0) // negative
    return false;
  if (!candidate) // == 0?
    return false;
  if (candidate==1) // 1 is not considered prime
    return false;
  if (candidate==2)
    return true;
  // the general case
  for (long i=2; i<sqrt(candidate)+1; i++)
    // does candidate divide evenly by i?
    if (!(candidate%i))
      return false;
  // if we got this far, the number is prime
  return true;
}

long CountPrimes::total(){
  if (counted) // only need to count once
    return count;
  for (long i=start; i<=stop; i++)
    if (is_prime(i))
      count++;
  // now that we have counted, set flag to true
  counted=true;
  return count;
}

# We then use this object in a straightforward
# manner with the arguments
# presented on the command line:

int main (int argc, char *argv[]){
  if (argc<3)
    usage(argv[0]);

  try {
    CountPrimes counter(atol(argv[1]),atol(argv[2]));
    if (counter.total()>1){
      cout << "There were " << counter.total();
      cout << " primes." << endl;
    }
    else{
      cout << "There was " << counter.total();
      cout << " prime." << endl;
}