1

我是 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 文件!)

球体.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)
{
}
4

5 回答 5

1

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

自编译以来Sphere.cpp失败,因此没有“Sphere.o”文件,并且链接器抱怨将在那里定义的所有内容。

在构建 C++ 时,从第一个错误开始检查错误很重要,因为这个错误通常会在以后导致更多错误。

于 2013-02-03T01:59:01.387 回答
1

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

vec3.cpp:

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

旁注,Sphere::area并且Sphere::volume需要在声明返回时返回值double

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

double Sphere::volume()
{
   return 0.0;
}
于 2013-02-03T10:51:52.377 回答
0

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

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

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

于 2013-02-02T23:43:01.660 回答
0

看看这个帖子,看看它是否对你有帮助......

C++ 致命错误 LNK1120:1 个未解决的外部

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

于 2013-02-02T23:43:07.387 回答
0

Without seeing the exact error you get it's hard to say exactly what the problem is. The error you are getting is caused by your linker complaining that it can not find the implementation of one "symbol" (=function, class...) you defined. This kind of error could be caused by a wrong usage of the precompiled headers in Visual Studio ("stdafx.h"). You should try to create a new project and deactivate precompiled headers, you don't need them for small projects. And by the way in C++ you should rather include <cmath> which wraps the C library <math.h> in the std namespace.

于 2013-02-02T23:47:55.800 回答