如何在 C++ 中使用 类 inside headers

How to use classes inside headers in c++

所以我是 c++ 的新手,我正在尝试测试它具有的简单功能。我目前有一个问题,有一个 'class' 类型重定义,我不知道为什么。我在头文件中使用过一次#pregama,但仍然如此。我什至尝试过#ifndef 和#define,但它们也不起作用。如果这与此有关,我正在使用 Visual studio 2019 社区。

Main.cpp

#include <iostream>
#include "Vectors.h"

using namespace std;

int main() {
    double distance = Vector2::Zero().Distance(Vector2(1, 1));
    cout << distance;

    return 0;
}

Vector2.cpp

#include "Vectors.h"
#include <cmath>

class Vector2 {
public:
    double x;
    double y;

    Vector2(double x, double y) {
        this->x = x;
        this->y = y;
    }

    static Vector2 Zero() {
        return Vector2(0, 0);
    }
    static Vector2 One() {
        return Vector2(1, 1);
    }
    double Distance(Vector2 other) {
        Vector2 relPos = this->operator-(other);
        relPos.x = abs(relPos.x);
        relPos.y = abs(relPos.y);

        return sqrt(pow(relPos.x, 2) + pow(relPos.y, 2));
    }

    Vector2 operator + (Vector2 vec) {
        return Vector2(x + vec.x, y + vec.y);
    }
    Vector2 operator - (Vector2 vec) {
        return Vector2(x - vec.x, y - vec.y);
    }
    Vector2 operator * (Vector2 vec) {
        return Vector2(x * vec.x, y * vec.y);
    }
    Vector2 operator / (Vector2 vec) {
        return Vector2(x / vec.x, y / vec.y);
    }
};

Vectors.h

#pragma once

class Vector2 {
public:
    Vector2(double x, double y);

    static Vector2 Zero();
    static Vector2 One();
    double Distance(Vector2 other);
    Vector2 operator + (Vector2 vec);
    Vector2 operator - (Vector2 vec);
    Vector2 operator * (Vector2 vec);
    Vector2 operator / (Vector2 vec);
};

您在 header 中定义了一次 class,在 C++ 文件中定义了一次。您不想在 C++ 文件中执行 class Vector2 { 。您的函数应该如下所示

Vector2 Vector2::operator+(Vector2 vec) {
  return Vector2(x + vec.x, y + vec.y);
}

并且应该在 C++ 文件中的 top-level 范围内定义。

首先,我同意 Silvio Mayolo 的观点,您在 header 中定义了一次 class,在 C++ 文件中定义了一次。您没有在 cpp 文件中使用关键字 class。

然后你需要区分 class Vector2Vector2(double x, double y); 就我而言你应该尝试使用 Vector2::.

这是我的代码:

Vectors.h:

#pragma once
class Vector2 {
public:
    double x;
    double y;

    Vector2(double x, double y);

    static Vector2 Zero();
    static Vector2 One();
    double Distance(Vector2 other);
    Vector2 operator + (Vector2 vec);
    Vector2 operator - (Vector2 vec);
    Vector2 operator * (Vector2 vec);
    Vector2 operator / (Vector2 vec);
};

Vector2.cpp:

#include "Vectors.h"
#include <cmath>

double x;
double y;

Vector2::Vector2(double x, double y) 
    {
        this->x = x;
        this->y = y;
    }



     Vector2 Vector2::Zero() {
        return Vector2(0, 0);
    }


    Vector2 Vector2::One() {
        return Vector2(1, 1);
    }
    double Vector2::Distance(Vector2 other) {
        Vector2 relPos = this->operator-(other);
        relPos.x = abs(relPos.x);
        relPos.y = abs(relPos.y);

        return sqrt(pow(relPos.x, 2) + pow(relPos.y, 2));
    }

    Vector2 Vector2::operator + (Vector2 vec) {
        return Vector2(x + vec.x, y + vec.y);
    }
    Vector2 Vector2::operator - (Vector2 vec) {
        return Vector2(x - vec.x, y - vec.y);
    }
    Vector2 Vector2::operator * (Vector2 vec) {
        return Vector2(x * vec.x, y * vec.y);
    }

    Vector2  Vector2::operator / (Vector2 vec) {
        return Vector2(x / vec.x, y / vec.y);
    }

Main.cpp:

    #include <iostream>
    #include "Vectors.h"

    using namespace std;

    int main() {
        double distance = Vector2::Zero().Distance(Vector2(1, 1));
        cout << distance;

        return 0;
    }