对象数组动态内存分配

时间:2012-04-23 18:10:04

标签: c++ arrays class memory-management

我正在尝试将动态内存分配给一个对象数组,但我不断收到以下错误:

“错误:C2143:语法错误:缺少';'在'*'之前 “错误:C2501:'Figura':缺少存储类或类型说明符”

欢迎任何帮助。我正在使用Visual Basic C ++ 2006,但是将使用Dosbox切换到Turbo C ++ 3.0以使graphics.h工作:(。

以下是代码:

#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) {



}

3 个答案:

答案 0 :(得分:2)

在这一行:

figuri = new Figura[nr_elemente];

编译器不知道类Figura存在。因此,它会产生错误,因为“Figura”在那一点上是一个未知的标记。你应该使用前瞻声明:

class Figura; // forward-declare class Figura

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


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

问题是编译器不知道类Figura的大小,因此它不能分配这种类型的对象数组。因此,您可能需要使用指针或修改类设计。

答案 1 :(得分:0)

您的问题是您尝试在一个文件中执行所有操作。如果将类的声明和定义移到单独的.hpp.cpp文件中,则不会出现此类问题。 移动

// file grup.hpp

class Figura; // forward declaration

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

grup.hpp文件。然后在Grup文件中实现group.cpp的构造函数:

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


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

同时将Figura类的定义和声明移动到相应的figura.hppfigura.cpp文件。最好对所有课程使用相同的方法。

答案 2 :(得分: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 您在下面的评论中看到的问题与您的无花果类的赋值运算符有关。

操作员看起来像这样......      图&安培; operator =(const Fig&amp;);

但是你的例子是你指定一个指针      void func(const Fig * fig)      {       // ...       figcontainer [index] = fig; //如果你做了* fig;你没事       // ...
     }