C++ 对空构造函数的神秘引用
这是我的头文件Normal.h:C++ 对空构造函数的神秘引用,c++,compiler-errors,C++,Compiler Errors,这是我的头文件Normal.h: #ifndef NORMAL_H #define NORMAL_H #include "Vector3.h" class Normal { public: Vector3 pos; Vector3 direction; Normal(Vector3, Vector3); }; #endif 以下是cpp文件Normal.cpp: #include "Normal.h" #include "Vector3.h" Normal::Nor
#ifndef NORMAL_H
#define NORMAL_H
#include "Vector3.h"
class Normal
{
public:
Vector3 pos;
Vector3 direction;
Normal(Vector3, Vector3);
};
#endif
以下是cpp文件Normal.cpp:
#include "Normal.h"
#include "Vector3.h"
Normal::Normal(Vector3 pos, Vector3 direction)
{
this->pos = pos;
this->direction = direction;
}
它们引用的是一个Vector3
类,该类没有不带参数的构造函数。指定的唯一构造函数接受3个整数
但我在尝试运行测试时出错:
g++ Normal.cpp -o NormalTest.cpp
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
/tmp/ccxgbatN.o: In function `Normal::Normal(Vector3, Vector3)':
Normal.cpp:(.text+0xd): undefined reference to `Vector3::Vector3()'
我不理解这个错误,它说我对“Vector3::Vector3()”有一个未定义的引用,它看起来是指这一行:Normal::Normal(Vector3 pos,Vector3 direction)
<>我不太懂C++,所以有什么帮助都可以理解。 这不是一个不寻常的C++问题。 要修复它,请尝试
Normal::Normal(Vector3 pos, Vector3 direction): pos(pos), direction(direction)
{
}
<>原因是你定义构造函数的方式,C++说:
pos
和direction
的默认值是什么?通过调用Vector3
的默认构造函数可以找到它们。。。但是没有定义!因此出现了错误
构造函数的替代版本使用初始值设定项而不是赋值,其工作原理如下:
Vector3
的复制构造函数,您应该可以
在一般情况下,使用初始化器代替赋值语句编写构造函数是一个好主意,正是由于这个原因。 < P>这不是一个不寻常的C++问题。 要修复它,请尝试
Normal::Normal(Vector3 pos, Vector3 direction): pos(pos), direction(direction)
{
}
<>原因是你定义构造函数的方式,C++说:
pos
和direction
的默认值是什么?通过调用Vector3
的默认构造函数可以找到它们。。。但是没有定义!因此出现了错误
构造函数的替代版本使用初始值设定项而不是赋值,其工作原理如下:
Vector3
的复制构造函数,您应该可以
一般来说,使用初始值设定项而不是赋值语句编写构造函数是一个好主意。在您运行的g++命令中,编译器首先编译,然后通过链接所有依赖项(正常情况下为Vector3)创建可执行文件 所以,假设有Vector3.cpp,您应该这样做
g++ Normal.cpp Vector3.cpp -o NormalTest
或
接下来,如果要从1个或多个.cpp文件中创建一个和可执行文件,那么至少有一个文件应该包含“main”方法。因此,将main方法添加到Normal.cpp或Vector3.cpp中,以消除“未定义对main的引用”错误。在您运行的g++命令中,编译器首先编译,然后通过链接所有依赖项(在Normal情况下为Vector3)创建可执行文件 所以,假设有Vector3.cpp,您应该这样做
g++ Normal.cpp Vector3.cpp -o NormalTest
或
接下来,如果要从1个或多个.cpp文件中创建一个和可执行文件,那么至少有一个文件应该包含“main”方法。因此,将一个主方法添加到Normal.cpp或VCCTRES3.CPP中,去掉“未定义的对main”的错误。 < P>您可能想考虑存储指针,而不是像现在这样存储对象。构造函数隐式地试图做的是构造两个空的Vector3,然后将参数的内容(pos、direction)复制到作为Normal的成员变量的空Vector3中 这些成员是嵌入对象,而不是指针 对空构造函数Vector3()的隐式调用是由这些嵌入对象的存在引起的 更典型的是存储指针,因此您可以声明如下内容:
class Normal
{
public:
Vector3 *pos;
Vector3 *direction;
Normal(Vector3*, Vector3*);
};
但是如果您坚持嵌入对象,我认为有一种语法可以从普通构造函数调用Vector3构造函数。是这样的:
Normal::Normal(Vector3 p, Vector3 dir) : pos(p), direction(dir) { }
您可能想考虑存储指针,而不是像现在这样存储对象。构造函数隐式地试图做的是构造两个空的Vector3,然后将参数的内容(pos、direction)复制到作为Normal的成员变量的空Vector3中
这些成员是嵌入对象,而不是指针 对空构造函数Vector3()的隐式调用是由这些嵌入对象的存在引起的 更典型的是存储指针,因此您可以声明如下内容:class Normal
{
public:
Vector3 *pos;
Vector3 *direction;
Normal(Vector3*, Vector3*);
};
但是如果您坚持嵌入对象,我认为有一种语法可以从普通构造函数调用Vector3构造函数。是这样的:
Normal::Normal(Vector3 p, Vector3 dir) : pos(p), direction(dir) { }