简体   繁体   中英

C++ Unresolved External with class method

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM