0

私はクラス 'dStructs' を持っています。このクラスでは、公的にアクセス可能な構造体 'entity' と 'point' をいくつか定義しています。これらの構造体は、クラス ブラケット dStructs 内で完全に定義されます。ただし、コンストラクターを正しく定義したかどうかはわかりません。コードは次のようになります...

#pragma once

#include <GL/glut.h>


class dStructs 
{


public:
    struct point
    {
        GLfloat x, y;

        point()
        {

        }

        point(GLfloat aX,GLfloat aY) //constructor for point
        {
            x = aX;
            y = aY;
        }
    };

    struct entity
    {
        point pos, size;

        entity()
        {

        }

        entity(GLfloat posX, GLfloat posY, GLfloat sizeX, GLfloat sizeY)
        {
            pos = point(posX,posY);
            size = point(sizeX, sizeY);
        }

    };

static void copyPoint(point pointToCopy, point& toPoint);
static void copyEntity(entity entityToCopy, entity& toEntity);

};

コンストラクターの定義を .cpp ファイルではなく、構造体のブレーキに配置するのが間違っていると思います。そこで、それらを移動して、.cpp内で定義しようとしました.....

#include "dStructs.h"

dStructs::point::point()
{
}

dStructs::point::point(GLfloat aX, GLfloat aY)
{
    x = aX;
    y = aY;
}

dStructs::entity::entity()
{

}

dStructs::entity::entity(GLfloat posX, GLfloat posY, GLfloat sizeX, GLfloat sizeY)
{
    pos = point(posX,posY);
    size = point(sizeX, sizeY);
}

ただし、コードで構造体「ポイント」または「エンティティ」が使用されている場所で未解決の外部シンボルエラーが発生するため、喜びはありません。

このエラーが発生するために、構造体 (およびそれらの相対コンストラクター) の宣言でどこが間違っているのか、誰にもわかりますか?

4

2 に答える 2

1

ただし、コードで構造体「ポイント」または「エンティティ」が使用されている場所で未解決の外部シンボルエラーが発生するため、喜びはありません。

これは、定義を.cppファイルに移動すると、後で対応するオブジェクトに実際にリンクする必要があるためです。

つまり、を使用する場合myfile.cppdStructs、(既に行っているように) ヘッダー ファイルをインクルードする必要があります。

g++ -o myprog myfile.cpp dStructs.cpp

また

g++ -c myfile.cpp
g++ -c dStructs.cpp
g++ -o myprog myfile.o dStructs.o
于 2013-03-20T12:15:02.963 に答える
0

ヘッダーと .cpp ファイルに定義があるため、複数の定義を受け取ります。

ヘッダーのコンストラクター宣言をメソッド プロトタイプのみに変更します。

すなわち

    point() // **change this to point();**
    {//remove

    }//remove
    point(GLfloat aX,GLfloat aY) // **change this to point(GLfloat aX,GLfloat aY);**
    {//remove
        x = aX;//remove
        y = aY;//remove
    }//remove
于 2013-03-20T12:28:54.463 に答える