使用 class 方法的 C++ 未解析外部

C++ Unresolved External with class method

我正在尝试创建一个函数,它根据参数随机生成一定数量的 Circle 对象。

我已经实现了该功能,但出现未解决的外部符号错误。

我不能在 class 方法中生成对象吗?我想,教授希望我们用 class 方法来实现它。

错误: 严重性代码描述项目文件行抑制状态 错误LNK2019 未解析的外部符号“public: static class std::vector > __cdecl Circle::generateCircles(int)" (?generateCircles@Circle@@SA?AV?$vector@PAVCircle@@V?$allocator@PAVCircle@@@std@@@std@@H @Z) 在函数_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;     
    }

}

您的代码缺少方法前面的 Circle:: 说明符,这意味着您声明的是函数而不是方法:

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;
}

应该是:

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;
}

看看你其他的方法对不对!