在C++中定义头文件

Defining header files in C++

本文关键字:文件 定义 C++      更新时间:2023-10-16

首先,我要提一下,我主要来自Java背景。我确实接触过 C 语言,并且了解C++背后的大多数概念。我试图帮助自己更多地了解该语言,但似乎无法弄清楚标题。我理解为什么除了 cpp 文件和所有这些之外还要使用它们。我的问题是试图实际管理与他们的合作。例如,使用私有浮点变量定义 Vector3 标头,然后重载操作。当我尝试在 cpp 文件中定义构造函数和方法时,我的问题出现了。如果不在标头中专门定义函数和构造函数,我似乎无法弄清楚如何访问私有变量,这或多或少使我相信在这种情况下我不需要标头和 cpp 文件。

以下是我目前定义头文件的方式(它有效,但不是应该未定义的):

#pragma once
#ifndef __Vector_3_H__
#define __Vector_3_H__
namespace VectorMath {
class Vector3 {
public:
    Vector3(float x, float y, float z) {
        this->x = x;
        this->y = y;
        this->z = z;
    }
    Vector3 operator+(Vector3 vector) {
        return Vector3(x + vector.x, y + vector.y, z + vector.z);
    }
    Vector3 operator-(Vector3 vector) {
        return Vector3(x - vector.x, y - vector.y, z - vector.z);
    }
    Vector3 operator*(Vector3 vector) {
        return Vector3(x * vector.x, y * vector.y, z * vector.z);
    }
    Vector3 operator/(Vector3 vector) {
        return Vector3(x / vector.x, y / vector.y, z / vector.z);
    }
    float getX() {
        return x;
    }
    float getY() {
        return y;
    }
    float getZ() {
        return z;
    }
private:
    float x;
    float y;
    float z;
};
}
#endif

它需要看起来更像这样:

Vector_3.h:

#ifndef Vector_3_H
#define Vector_3_H
#pragma once
namespace VectorMath {
class Vector3 {
public:
    Vector3(float x, float y, float z);
    Vector3 operator+(Vector3 vector);    
    Vector3 operator-(Vector3 vector);
    Vector3 operator*(Vector3 vector);
    Vector3 operator/(Vector3 vector);
    float getX();
    float getY();
    float getZ();
private:
    float x;
    float y;
    float z;
};
}
#endif

Vector_3.cpp:

#include "Vector_3.h"
namespace VectorMath {
Vector3::Vector3(float x, float y, float z) {
    this->x = x;
    this->y = y;
    this->z = z;
}
Vector3 Vector3::operator+(Vector3 vector) {
    return Vector3(x + vector.x, y + vector.y, z + vector.z);
}
Vector3 Vector3::operator-(Vector3 vector) {
    return Vector3(x - vector.x, y - vector.y, z - vector.z);
}
Vector3 Vector3::operator*(Vector3 vector) {
    return Vector3(x * vector.x, y * vector.y, z * vector.z);
}
Vector3 Vector3::operator/(Vector3 vector) {
    return Vector3(x / vector.x, y / vector.y, z / vector.z);
}
float Vector3::getX() {
    return x;
}
float Vector3::getY() {
    return y;
}
float Vector3::getZ() {
    return z;
}
}
如果你想为

构造函数使用 cpp 文件,你应该写

// File Vector3.cpp
#include "Vector3.h"
namespace VectorMath {
    Vector3::Vector3 (float x, float y, float z)         
    { 
        this->x=x;
       //...
    }

如果将其保留在同一命名空间中,则应按如下方式实现添加

    Vector3 Vector3::operator+(const Vector3& v)
    { 
        return Vector3 (x+v.x,y+v.y,z+v.z);
    }
}

如果要将成员函数的实现移出头文件,仍需要在类的定义中声明它们。例如:

// Vector1.h
#pragma once
#ifndef VectorMath_Vector1_H
#define VectorMath_Vector1_H

namespace VectorMath {
class Vector1 {
public: // Methods:
    // This is a definition for a default constructor:
    Vector1() noexcept : m_x(0) {}
    // This is a declaration for another constructor:
    Vector1(float x) noexcept;
    // This is a declaration of a member function:
    Vector1 operator+(Vector1 const & rhs) const noexcept;
private: // Fields:
    float m_x;
}; // class Vector1
} // namespace VectorMath {
#endif // VectorMath_Vector1_H
// Vector1.cpp
#include "Vector1.h"

namespace VectorMath {
// Definition of the other constructor:
Vector1::Vector1(float x) noexcept
    : m_x(x)
{}
// Definition of the binary + operator:
Vector1 Vector1::operator+(Vector1 const & rhs) const noexcept
{ return m_x + rhs.m_x; }
} // namespace VectorMath {