在另一个头文件c ++中创建一个类的实例

时间:2013-02-02 23:39:56

标签: c++ oop header

我在c ++编程方面很陌生......一年前我开始用c#编程,所以我在一些非常基本的东西上失败了......我想...... 我创建了一个名为vector的类,它是3d空间中的一个点,其标题如下所示:

class vec3
{
    double x, y, z;
public:
    vec3();
    vec3(double x, double y, double z);
    double calculateLLength(void);
    double distance(double x1, double y1, double z1);
    double distance(const vec3 &vec);
    ~vec3(void);
};

在此之后,我应该写一个名为sphere的类,其中心点是 我的矢量类中的矢量看起来像这个(球体标题):

#pragma once
#include "vec3.h"
class Sphere
{
    vec3 center1;
    double x, y, z;
    double radius1;
    static const double PI;

public:

    //constructs
    Sphere(double x, double y, double z, double radius);
    Sphere(vec3 center1, double radius);
    //Methods
    bool inside(const vec3 &center);
    bool overlap(const Sphere &sphere);
    double area();
    double volume();
    ~Sphere(void);
};

我得到的错误是:错误LNK1120:1个未解析的外部

我试图谷歌这个,并在我周六的大部分时间里试图解决它但不能...... 我很乐意帮忙!提前谢谢!

(如果有人需要,这是cpp文件!)

Sphere.cpp:

#include "StdAfx.h"
#include "Sphere.h"
#include "vec3.h"
#include <math.h>

const double Sphere::PI = 3.1415926535;
Sphere::Sphere(double centerX, double centerY, double centerZ, double radius)
{
    vec3 center(centerX, centerY, centerZ);
    radius1 = radius;
}

Sphere::Sphere(vec3 center, double radius)
{
    center1 = center;
    radius1 = radius;
}
bool Sphere::inside(const vec3 &center)
{
    if(radius1 < center1.distance(center))
        return false;
    else
        return true;
}
bool Sphere::overlap(const Sphere &sphere)
{
    if(this->center1.distance(sphere.center1) < radius1 + sphere.radius1)
        return true;
    else 
        return false;
}
double Sphere::area()
{
}

double Sphere::volume()
{
}

Sphere::~Sphere(void)
{
}

vec3.cpp:

#include "StdAfx.h"
#include "vec3.h"
#include <math.h>


vec3::vec3(double x, double y, double z)
{
    this->x=x;
    this->y=y;
    this->z=z;
}

double vec3::calculateLLength()
{
    return sqrt((x*x) + (y*y) + (z*z));
}

double vec3::distance(double x1, double y1, double z1)
{
    return sqrt( ((this->x - x1)*(this->x - x1)) + ((this->y - y1)*(this->y - y1)) + ((this->z - z1)*(this->z - z1)) );
}

double vec3::distance(const vec3 &vec)
{
    return sqrt( ((this->x - vec.x)*(this->x - vec.x)) + ((this->y - vec.y)*(this->y - vec.y)) + ((this->z - vec.z)*(this->z - vec.z)) );
}

vec3::~vec3(void)
{
}

5 个答案:

答案 0 :(得分:1)

如果您发布的代码是实际代码,那么您收到该消息是因为之前的编译失败了 - Sphere::areaSphere::volume 必须返回一些内容,但是您的空。

由于Sphere.cpp的编译失败,因此没有“Sphere.o”文件,并且链接器会抱怨那里已定义的所有内容。

当你构建C ++时,重要的是要从第一个开始经历错误,因为这个错误经常会导致更多的错误。

答案 1 :(得分:1)

问题是您已经声明了vec3的默认构造函数,但是您没有为它提供定义。将以下代码添加到vec3.cpp:

vec3.cpp:

vec3::vec3()
:x(0),y(0),z(0)
{
}

旁注,Sphere::areaSphere::volume需要返回值,因为它们已声明返回double

double Sphere::area()
{
   return 0.0;
}

double Sphere::volume()
{
   return 0.0;
}

答案 2 :(得分:0)

在编译实际程序时,您可能忘记将所有cpp文件链接在一起。

通过在头文件(* .h)中声明您的类,您只需要描述类的外观。您还需要定义这些类的实现;这些是在源文件(* .cpp)中编写的内容。当您将最终程序链接在一起时,请确保您链接所有已编译的源文件,否则链接器将无法解析定义以查找您已经的内容>声明

我不知道您的构建环境是如何设置的,但典型IDE中的解决方案是确保所有源都标记为用于创建最终可执行文件。

答案 3 :(得分:0)

看一下这篇文章,看看它是否对你有帮助......

C++ Fatal Error LNK1120: 1 unresolved externals

根据我的理解,当您设置项目时,您没有指定您将使用Windows应用程序,因此它没有将Windows API与您的应用程序相关联。

答案 4 :(得分:0)

如果没有看到确切的错误,就很难确切地说出问题所在。你得到的错误是由你的链接器抱怨它无法找到你定义的一个“符号”(= function,class ...)的实现引起的。这种错误可能是由Visual Studio中的预编译头文件的错误使用引起的(“stdafx.h”)。您应该尝试创建一个新项目并停用预编译的头文件,对于小项目,您不需要它们。顺便说一句,在C ++中,您应该包含<cmath>,它将C库<math.h>包装在std命名空间中。