2

前方宣言に問題があると思います。必要だと思いますが、よくわかりません。

基本的に私はmain.cppを持っています:

//main.cpp
#include <iostream>
#include "CalculateForces.h"
#include "ParticleBox.h"

int main(void)
{
    //g++ main.cpp ParticleBox.cpp -lgsl -lgslcblas -lm -std=c++0x

    CalculateForces* calculate_forces= new CalculateForces();
    ParticleBox* particles_box = new ParticleBox(2000,100,100,100);

    delete calculate_forces;
    delete particles_box;

    return 0;

}

CalculateForces.hは次のようになります。

//CalculateForces.h
//We update the forces on each particle
class ParticleBox;
class CalculateForces
{
    public:
        CalculateForces(void);
        ~CalculateForces(void);
        int UpdateForces(ParticleBox* particlebox);
        int DiscretizeSpace(float cutoff_distance);
        int LJForce(int local_index, int remote_index, ParticleBox* particlebox);               

};

そして最後に、ParticleBox.hファイルは次のようになります。

//ParticleBox.h
//This is the definition of the particlebox. We manage all the particles in this
//file

//This should be changed to a template so that we can run float and double calcs properly :D
struct Particle;

class ParticleBox
{
public:
    ParticleBox(int Num_Particles, float Box_length_x_, float Box_length_y_, float Box_length_z_);
    ~ParticleBox(void);
    int set_num_particles(int Num_Particles);
    int InitialiseUniverse(int temp,float mass);
    float Boltzmann(float temperature);
    int GenerateRandomUniquePositions(int number, float max, float min, float* rand_dim_positions);

private:
    //Array to hold particles. Each particle has its own struct
    Particle** particle_list_;

    int num_particles_;
    float box_length_x_;
    float box_length_y_;
    float box_length_z_;
    float* rand_x_positions_;
    float* rand_y_positions_;
    float* rand_z_positions_;
    float cutoff_distance_;
    float sigma_;
    float epsilon_;

};

int CalculateForces::DiscretizeSpace(float cutoff_distance, ParticleBox* particlebox)
{
    ......
    return 0;

}

Particle StructのParticleBox.hで前方宣言を使用し、Particle*型のポインターをクラスに追加できます。これは正常に機能します。

クラスParticleBoxのCalculateForces.hの転送により、大量のコンパイラエラーが発生します(投稿するには多すぎますが、以下と同じ方法で開始されます)。これを省略すると、わずかなエラーしか発生しません。

In file included from main.cpp:3:0:
CalculateForces.h:9:20: error: ‘ParticleBox’ has not been declared
CalculateForces.h:11:50: error: ‘ParticleBox’ has not been declared
In file included from CalculateForces.cpp:3:0:
CalculateForces.h:9:20: error: ‘ParticleBox’ has not been declared
CalculateForces.h:11:50: error: ‘ParticleBox’ has not been declared
CalculateForces.cpp:12:35: error: ‘int CalculateForces::UpdateForces’ is not a static member of ‘class CalculateForces’
CalculateForces.cpp:12:35: error: ‘ParticleBox’ was not declared in this scope
CalculateForces.cpp:12:48: error: ‘particlebox’ was not declared in this scope
CalculateForces.cpp:13:1: error: expected ‘,’ or ‘;’ before ‘{’ token

その型を引数として使用しようとすると、前方宣言が必要になると思いましたか?私は何が間違っているのですか?

長い投稿をありがとうと申し訳ありません

4

2 に答える 2

1

前方宣言を省略したときに表示されるエラーを投稿し、コードにいくつかの追加のエラーがあり、それがあなたが尋ねたエラーと混ざり合っているため、あなたの投稿は非常に混乱しています。

前方宣言を使用すると、エラーは主に実装ファイルに表示されるように変化すると思いますよね?この場合、問題は、型へのポインターを宣言する限り前方宣言で十分である可能性がありますが、ポインターの使用を開始する(逆参照する)ときは十分ではありません。

その場合、問題はあなたが(または他のいくつかの実装ファイル)を忘れた可能性が高い#include "ParticleBox.h"ですCalculateForces.cpp

于 2013-03-08T18:10:03.940 に答える
0

Robがエラーの原因を特定したので、私が投稿しなかったコードが少しありました。いくつかのエラーがありましたが、最大のものは、CalculateForces.cppでint num_particles_;、もちろんParticleBoxのプライベートメンバーであるアクセスを試みたことです。

于 2013-03-09T14:32:53.933 に答える