簡體   English   中英

在C ++中定義頭文件

[英]Defining header files in C++

首先,我會提到我主要來自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 {

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM