I am trying to make a function which randomly generates a certain number of Circle objects, depending on the parameter.
I have implemented the function, but am getting Unresolved External Symbol errors.
Can I not generate objects in a class method? The professor wanted us to implement it in a class method, I think.
The error: Severity Code Description Project File Line Suppression State Error LNK2019 unresolved external symbol "public: static class std::vector<class Circle *,class std::allocator<class Circle *> > __cdecl Circle::generateCircles(int)" (?generateCircles@Circle@@SA?AV?$vector@PAVCircle@@V?$allocator@PAVCircle@@@std@@@std@@H@Z) referenced in function _main naloga0301 C:\Users\aleks\source\repos\naloga0301\main.obj 1
Circle.h:
#pragma once
#include <iostream>
#include <vector>
#include <string>
class Circle {
private:
double radius;
static double counter;
public:
double getRadius() const;
void setRadius(double newRadius);
Circle();
Circle(double r);
Circle(const Circle& circ1) { radius = circ1.radius; counter = circ1.counter; Circle::counter++; }
static std::vector<Circle*> generateCircles(int numberOfCircles);
~Circle();
std::string toString() const;
static void printCounter();
double diameter() const;
double area() const;
};
Circle.cpp:
#include <iostream>
#include <vector>
#include <string>
#include "Circle.h"
#include "Math.h"
double Circle::counter = 0;
double Circle::getRadius() const
{
return radius;
}
void Circle::setRadius(double newRadius)
{
this->radius = newRadius;
}
Circle::Circle(double r) : radius(r) {
//increments counter every time a constructor for Circle is called
Circle::counter++;
}
Circle::~Circle() {
//when a destructor is called, decrement the counter
Circle::counter--;
}
std::string Circle::toString() const
{
//adds up the data to one string which is returned
std::string data;
double r = getRadius();
data = "Radius: " + std::to_string(r) + "cm, diameter: " + std::to_string(diameter()) + "cm2, area: " + std::to_string(area()) + "cm3";
return data;
}
void Circle::printCounter()
{
std::cout << counter << std::endl;
}
double Circle::diameter() const
{
double diam = 2 * Math::pi * getRadius();
return diam;
}
double Circle::area() const
{
return Math::pi * Math::square(getRadius());
}
std::vector<Circle*> generateCircles(int numberOfCircles) {
//uses dynamic memory allocation to generate a desired number of Circle instances
std::vector<Circle*> circles(numberOfCircles);
for (int i = 0; i < numberOfCircles; i++) {
circles[i] = new Circle(rand());
}
return circles;
}
main.cpp:
#include <iostream>
#include <string>
#include <vector>
#include <random>
#include <time.h>
#include "Math.h"
#include "Circle.h"
void printCircles(std::vector<Circle*> circles);
int main()
{
srand(time(NULL));
Circle::printCounter();
std::vector<Circle*> circlez = Circle::generateCircles(10);
Circle::printCounter();
printCircles(circlez);
Circle c1(10.5);
Circle c2(6.0);
std::cout << "Circle with " << Math::max(c1, c2).toString() << " has a bigger diameter." << std::endl;
Circle::printCounter();
return 0;
}
void printCircles(std::vector<Circle*> circles) {
//iterates over the vector and uses toString() on each instance of Circle
for (int i = 0; i < circles.size(); i++) {
std::cout << circles[i]->toString() << std::endl;
}
}
Your code is missing the Circle::
specifier in front of the method, meaning you declared a function not a method:
std::vector<Circle*> generateCircles(int numberOfCircles) {
//uses dynamic memory allocation to generate a desired number of Circle instances
std::vector<Circle*> circles(numberOfCircles);
for (int i = 0; i < numberOfCircles; i++) {
circles[i] = new Circle(rand());
}
return circles;
}
It should be:
std::vector<Circle*> Circle::generateCircles(int numberOfCircles) {
//uses dynamic memory allocation to generate a desired number of Circle instances
std::vector<Circle*> circles(numberOfCircles);
for(int i = 0; i < numberOfCircles; i++) {
circles[i] = new Circle(rand());
}
return circles;
}
Look at your other methods were you made it correct!
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.