1

我有以下问题:

我有一个 Pawn,它站在一个字段上。所以我有 Class Pawn 和 Class Field。我想从 Field 访问站在它上面的 Pawn,我想从 Pawn 访问它所在的 Field。

所以我有课:

class Pawn;
class Player;
class Field;
class PlayerList;

class Pawn
{
    public:
        int intID;
        Player* plrPlayer;
        Field* fldField;

        ...

 int getPosition()
{
    //gets the ID of the Field it stands on 
    return fldField->intID; //Here i get the error
}
}

class Field
{
    public:
    Pawn* pwnPawn;
    int intID;
    Field()
    {
        intID = -1;
    }
    Field(int intIDParam)
    {
        intID = intIDParam;
    }
};

g++ 说

Error: invalid use of incomplete type "class Field"
Error: Forward declaration of class Field

或者

    main.cpp: In Elementfunktion »int Pawn::getPosition()«:
    main.cpp:42:24: Fehler: falsche Benutzung des unvollständigen Typs »class Field«
    main.cpp:10:7: Fehler: Vorwärtsdeklaration von »class Field«

除了在类之外声明事物之外还有其他方法吗,或者我真的必须在需要它们之前声明它之外的所有方法/成员吗?

我能做些什么?谢谢你。

编辑:谢谢,但我现在尝试将它分成一个 .h 和一个 .cpp 文件。稍后我将为每个类使用一个 .h 和一个 .cpp 文件,但现在我只需

头文件.h

#ifndef _HEADERS_
#define _HEADERS_
#include <iostream>
#include <unistd.h>
#include <stdlib.h>
#include <vector>
using namespace std;

class Pawn;
class Player;
class Field;
class PlayerList;

class Pawn
{
    public:
        int intID;
        Player* plrPlayer;
        Field* fldField;

//Constructors....

int getPosition();
...
};
#endif 

实现.cpp

#ifndef _IMPLEMENTATIONS_
#define _IMPLEMENTATIONS_
#include "headers.h"
//Pawn.cpp
int Pawn::getPosition()
{
    return fldField->intID;
}

...

#万一

在 main.cpp 我包括“implementations.cpp”

我得到错误

In function Pawn::getPosition
multiple definition of Pawn::getPosition

我做错了什么?

4

3 回答 3

0

您收到错误的原因是因为您在 Pawn.h 中转发了声明的 Field(这很好!),但是您已经实现了一个在头文件中使用 Field 对象的函数。

编译器想知道 intID 是什么,因为您没有指定 Field 的定义。

正如 littleadv 已经很好解释的那样,将它们分开并包含在 .cpp 文件中的头文件(或)删除头文件中的前向声明并包含 Field.h

于 2013-10-13T09:30:33.727 回答
0

单独的声明和实现。在单独的 cpp 文件中实现这些类。应该是这样的:

头文件:

class Player;
class Field;
class PlayerList;

class Pawn
{
    public:
        int intID;
        Player* plrPlayer;
        Field* fldField;

        ...

 int getPosition();

}

class Field
{
    public:
    Pawn* pwnPawn;
    int intID;
    Field()
    {
        intID = -1;
    }
    Field(int intIDParam)
    {
        intID = intIDParam;
    }
};

C++ 文件:

#include <header...>

int Pawn::getPosition()
{
    //gets the ID of the Field it stands on 
    return fldField->intID; //Here i get the error
}

不将多个类放在同一个翻译单元中也是一种普遍接受的做法,但这更像是一种指导,使代码更清晰。

于 2013-10-13T08:40:49.147 回答
0

在类中使用声明而不是定义Pawn

int getPosition() const;

类之后,Field实现它:

int Pawn::getPosition() const
{
    //gets the ID of the Field it stands on 
    return fldField->intID;
}

(请注意,我const建议get此方法不应修改它正在处理的实例)

稍后您将希望将声明和定义分离到头文件和实现文件中,另一个答案已经有一些信息。


分离标题,创建pawn.hfield.h. 我想你知道该怎么做。

您的实现文件pawn.cpp应如下所示:

// note: no include guards for the 
#include "pawn.h" // you need the header for pawn
#include "field.h" // and the header for field since here you are using it

int Pawn::getPosition()
{
    return fldField->intID;
}

你对field.cpp. 然后你单独编译这些文件,你main.cpp也不应该包含这些*.cpp文件。

要将所有内容编译并链接在一起,这应该可以帮助您入门:

# compile each source file into an object file
g++ -Wall -c field.cpp -o field.o
g++ -Wall -c pawn.cpp -o pawn.o
g++ -Wall -c main.cpp -o main.o
# link them together into an executable
g++ field.o pawn.o main.o -o main
# run the executable
./main
于 2013-10-13T08:41:11.290 回答