1

私はC++でのプログラミングにまったく慣れていません...1年前にC#でプログラミングを始めたので、いくつかの本当に基本的なものに失敗しています...私は思います...私は3Dのポイントであるvectorと呼ばれるクラスを作成しましたヘッダーのスペースは次のようになります。

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)
{
}
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アプリケーションを使用することを指定しなかったため、WindowsAPIをアプリケーションに関連付けませんでした。

于 2013-02-02T23:43:07.387 に答える
0

正確なエラーを見ずに、問題が何であるかを正確に言うのは難しいです。発生するエラーは、定義した1つの「シンボル」(=関数、クラス...)の実装が見つからないというリンカの不満が原因で発生します。この種のエラーは、Visual Studio( "stdafx.h")でのプリコンパイル済みヘッダーの誤った使用によって引き起こされる可能性があります。新しいプロジェクトを作成し、プリコンパイル済みヘッダーを非アクティブ化する必要があります。小さなプロジェクトでは必要ありません。ちなみに、C ++では、名前空間<cmath>にCライブラリをラップするものを含める必要があります。<math.h>std

于 2013-02-02T23:47:55.800 に答える