【问题标题】:Two classes that refer to each other in their constructor在构造函数中相互引用的两个类
【发布时间】:2021-07-26 04:36:09
【问题描述】:

我想创建一种 2 维向量数据类型和一种 3 维向量数据类型,但它们应该相互兼容。

这是类定义

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

我希望能够调用这样的函数:

// 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 vec2;
class vec3;

到顶部,出现以下链接器错误:'LNK2005 "public: __cdecl vec2::vec2(class vec3)" already defined in main.obj'

但是如果我删除类原型,就会出现这个错误:'C2061 syntax error vec3'(因为构造函数声明“vec2(vec3 V);”在类vec2中。

注意我也加了

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

在类之外,因为 vec3 尚未定义并且会抛出:“use of undefined type”

【问题讨论】:

  • 两者都应该互相兼容,你的意思是convertible

标签: c++ class vector constructor


【解决方案1】:

由于vec2::vec2(vec3 V)是在.h文件中实现的,所以改成inline

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

否则,每个包含 .h 文件的 .cpp 文件都具有构造函数的非内联实现。这会导致链接器报告的问题。

另一种选择是将定义移动到 .cpp 文件中(而不是使用 inline)。

【讨论】:

  • 附带说明,两个转换构造函数都应该通过 const 引用而不是值来获取输入,例如:vec2(const vec3 &V);vec3(const vec2 &V),然后您的函数调用可以简化:func_Vec2(mySpace); func_Vec3(myPosition);跨度>
  • 我对它进行了测试,奇怪的是,如果我不使用您的解决方案,它甚至看起来像这样工作。单独的构造函数似乎也可以完成这项工作。
  • @KittenpawFromsoftfur 这是有道理的。但是,如果不使用const&,您将付出在每个函数调用中构建副本和破坏副本的代价。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 2014-08-04
  • 2016-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多