2011-05-12 93 views
0

我有两个类,希望有一个从类昆德到类Konto和向后的引用,但我的编译器显示许多错误。我不知道问题是什么。请帮帮我。班级成员属性错误

类KONTO:

#pragma once 
#include "Kunde.h" 

class Konto { 
private: 
    Kunde* kunde; 
protected: 
    int kontonummer; 
    double stand; 
public: 
    int getKontonummer(); 
    Kunde* getKunde(); 
    double getKontostand(); 
    bool einzahlen(double betrag); 
    virtual bool auszahlen(double betrag); 
}; 

类昆德:

#pragma once 
#include "Konto.h" 
#include <string> 

class Kunde { 
private: 
    string vorname; 
    string nachname; 
    Konto* konto; 
public: 
    Kunde(string vorname, string nachname); 
    void setKonto(Konto* konto); 
    Konto* getKonto(); 
}; 

我获得以下编译器errrors:

konto.h(6): error C2143: syntax error: missing ';' before '*'
konto.h(6): error C4430: missing typespecifier - int assumed. Note: C++ does not support "default-int"
konto.h(6): error C4430: missing typespecifier - int assumed. Note: C++ does not support "default-int"

和更多一些。

+2

不与你的问题,但有人已经相当广泛在欧洲工作过,我发现,使用被翻译成当地语言的工具只会限制你。您将无法搜索常见的错误消息,像我这样的人可能无法解释它们。使用英语语言工具,无论您的本地经销商可能试图强加于您。用英文写代码也是一个好主意。 – 2011-05-12 18:51:28

+0

你是对的,我没有太在意这一点,因为我解决了大多数问题,而没有为解决方案进行讨论。但是当我注意到它时仍然贴出来。感谢您的建议,我会将该翻译更改为英文。关于代码,我想给colleaque一个学习oop的简单例子,在这种情况下,在我使用德语编写代码时这很容易;) – 2011-05-12 18:58:13

+0

顺便说一句请注意(在下雨之前下降)我没有任何反对德语或德国人 - 我在德国北部的皇家空军Jever度过了两个愉快的时光。 – 2011-05-12 19:07:12

回答

2

您有一个圆形包含问题。您在头文件的第一行看到#pragma once语句?这可防止包含标题(如果已包含)。由于您的头文件包含对方,在KundeKonto的声明中,另一个尚未定义。

如果您在其他头文件中对任一类进行了简单的前向声明,则可以规避该问题。具体做法是:

(Konto.h)

#pragma once 

// Do NOT include Kunde.h 

class Kunde; 

class Konto { 
    // your further class definition as normal. 

的唯一的事情是,你现在应该包括Kunde.hKonto.cpp,否则这将导致连接错误。

编辑:看评论:)谢谢

+1

“circumnavigte” - 我不认为这意味着你的想法。 – 2011-05-12 19:05:19

+0

否则,很好的解释。 +1。 “智取”。 – 2011-05-12 19:18:35

4

头文件不能包含对方。相反,#包括的,尝试在一个预先声明或两者兼而有之,就像这样:

class Kunde; 
1

包括另一包括第一个文件一个文件,包括包括第一档,第二档...

肯定会混淆#pragma once

1

Konto包括Kunde.h,Kunde包括Konto.h。在这两种情况下都做前向声明

1

这是一种经典的循环依赖。你可以用几种方法处理它。第一种是使用正在尝试引用的其他类的前向声明。您还需要删除其他课程的包含。

class Konto;

类昆德 { Konto * konto; ... };

另一种方法是抽象出一个能够给你想要的界面。如果你愿意的话,我可以详细讨论这种方法。