C++ 对空构造函数的神秘引用

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

这是我的头文件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::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) { }
    
  • 你没有在任何地方定义一个'main'函数,入口点,调用其他所有东西的函数。
  • 调用编译器`g++Normal.cpp-o NormalTest.cpp`,告诉它编译`Normal.cpp`并生成一个可执行文件(名为`NormalTest.cpp`,至少在两个方面是错误的),但它不能,因为`Normal.cpp`尤其没有`main`函数。
  • “Vector3”类有一个接受三个参数的构造函数。通常,编译器会为您创建的任何类提供默认构造函数(即不带参数的构造函数),但如果您定义了带参数的构造函数,则编译器不会提供默认构造函数。(这是C++语言的一部分,而不是编译器问题)如果你没有定义一个“VECRTR3”的构造函数,它不需要参数,那么你必须设计你的“正常”构造函数,用你所提供的构造函数构造成员'VCIETRO3'。
  • 从HelloWorld开始。总是从HelloWorld开始。
  • 你没有在任何地方定义一个'main'函数,入口点,调用其他所有东西的函数。
  • 你的祈祷