簡體   English   中英

在構造函數中相互引用的兩個類

[英]Two classes that refer to each other in their constructor

我想創建一個 2 維向量數據類型和一個 3 維向量數據類型,但它們都應該相互兼容。

這是 class 定義

class vec2;
class vec3;

class vec2
{
public:
    FLOAT x, y;

    vec2(FLOAT X = 0, FLOAT Y = 0)
    {
        x = X;
        y = Y;
    }

    // constructor declaration (necessary because of "use of undefined type")
    vec2(vec3 V);
};

class vec3
{
public:
    FLOAT x, y, z;

    vec3(FLOAT X = 0, FLOAT Y = 0, FLOAT Z = 0)
    {
        x = X;
        y = Y;
        z = Z;
    }

    vec3(vec2 V)
    {
        x = V.x;
        y = V.y;
        z = 0;
    }
};

vec2::vec2(vec3 V)
{
    x = V.x;
    y = V.y;
}

我希望能夠像這樣調用 function:

// prototypes
int func_Vec2(vec2 Position);
int func_Vec3(vec3 Space);

// create variables
vec2 myPosition(100, 100);// creates a vector "myPosition" with x = 100, y = 100
vec3 mySpace(100, 200, 300);// creates a vector "mySpace" with x = 100, y = 200, z = 300

// call functions with compatible datatypes
func_Vec2(vec2(mySpace));// mySpace is vec3 but the constructor of vec2 allows a vec3 as parameter
func_Vec3(vec3(myPosition));// myPosition is vec2 but the constructor of vec3 allows vec2 as parameter

但是,無論我對 class 定義/構造函數進行了多少試驗,每次嘗試都會帶來另一個錯誤,而且我已經沒有想法了。

因為我加了

class vec2;
class vec3;

到頂部,出現以下 linker 錯誤:'LNK2005 "public: __cdecl vec2::vec2(class vec3)" already defined in main.obj'

但是,如果我刪除 class 原型,則會發生此錯誤:'C2061 syntax error vec3'(由於 class vec2 中的構造函數聲明“vec2(vec3 V);”。

請注意,我還添加了

vec2::vec2(vec3 V)
{
    x = V.x;
    y = V.y;
}

在 class 之外,因為 vec3 尚未定義並且會拋出:“使用未定義類型”

由於vec2::vec2(vec3 V)在 .h 文件中實現,因此將其設為inline

inline vec2::vec2(vec3 V)
{
    x = V.x;
    y = V.y;
}

否則,包含 .h 文件的每個 .cpp 文件都具有構造函數的非內聯實現。 這會導致 linker 報告的問題。

另一個選項是將定義移動到 a.cpp 文件(而不是使用inline )。

暫無
暫無

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

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