0

オブジェクトの配列に動的メモリを割り当てようとしていますが、次のエラーが発生し続けます。

「エラー: C2143: 構文エラー: ';' がありません '*' の前に""エラー: C2501: 'Figura' : ストレージ クラスまたは型指定子がありません"

どんな助けでも大歓迎です。私は Visual Basic C++ 2006 を使用していますが、Graphics.h を動作させるために Dosbox で Turbo C++ 3.0 に切り替えます :( .

コードは次のとおりです。

#include<iostream.h>

class Grup {
    private:
        int nr_elemente;
        Figura *figuri;
    public:
        Grup() {
            figuri = new Figura[nr_elemente];
        }
};


class Figura {

public:
    Figura();
    ~Figura();
    Figura(const Figura&);

    friend Figura operator+(const Figura& fig1, const Figura& fig2) {};
    friend Figura operator+(const Grup& gr1, const Grup& gr2) {}

    friend Figura operator*(const Figura& fig) {}
    friend Figura operator*(const Figura& fig) {}

};

Figura operator+(const Figura& fig, const Grup& gr) {
    return fig;
}

class Punct : Figura
{
public:
    int x, y;

    Punct(int x, int y) {
        Punct::x = x;
        Punct::y = y;
    }
};

class Segment : Figura
{
public:
    int x, y, poz;
};

class Dreptunghi : Figura
{
public:
    int x, y, poz;
};

void main(void) {



}
4

3 に答える 3

2

この行で:

figuri = new Figura[nr_elemente];

コンパイラは、クラスが存在することを知りませんFigura。したがって、「Figura」はその時点で不明なトークンであるため、エラーが発生します。前方宣言を使用する必要があります。

class Figura; // forward-declare class Figura

class Grup {
/* ... */
};


class Figura {
/* ... */
};

問題は、コンパイラが class のサイズを認識していないFiguraため、この型のオブジェクトの配列を割り当てることができないことです。したがって、おそらくポインターを使用するか、クラスの設計を変更する必要があります。

于 2012-04-23T18:14:12.040 に答える
0

問題は、すべてを1つのファイルで実行しようとしていることです。.hppクラスの宣言と定義を別々の.cppファイルに移動すれば、このような問題は発生しません。動く

// file grup.hpp

class Figura; // forward declaration

class Grup {
private:
    int nr_elemente;
    Figura *figuri;
public:
    Grup();
};

grup.hppファイルに。次に、infileのコンストラクターを実装Grupgroup.cppます。

// file grup.cpp
#include "grup.hpp"
#include "figura.hpp"


Grup::Grup()
{
    figuri = new Figura[nr_elemente];
}

また、Figuraクラスの定義と宣言を対応するファイルに移動しfigura.hppますfigura.cpp。あなたが持っているすべてのクラスで同じアプローチを使用する方が良いです。

于 2012-04-23T18:34:52.447 に答える
0

すでに述べたように、前方宣言する必要がありますが、それだけでは十分ではありません。クラスを実装として使用するには、クラスのサイズを知る必要があります。したがって...

class Figura;
class Grup{
  Figura * figuri;
  //.. other stuff, but ONLY declarations no implementations.
};

class Figura
{
  //Same as you already have...
};

クラスが宣言された後、それらは同じファイルにあるため、他のクラスが実装 (または宣言) された後に実装する必要があります。

//Still same file but below the Figura class definition..
Grup::Grup() {
   //Now you can use Figura...
   figuri = new Figura[nr_elemente];
}  

@be 以下のコメントで見られる問題は、fig クラスの代入演算子に関係しています。

演算子は次のようになります... Fig& operator=(const Fig& );

しかし、あなたの例では、ポインター void func(const Fig * fig) { //... figcontainer[index] = fig; を割り当てています。// *fig; を実行した場合 あなたは大丈夫だろう //...
}

于 2012-04-23T19:00:30.453 に答える