Как создавать объекты перед классом?

#c #declaration

#c #объявление

Вопрос:

Я знаю, что мы не можем использовать переменную или объект перед объявлением в.

Ниже приведены три класса, и для того, чтобы использовать этот класс, я создал три объекта (перед классом), и я подумал, что если я напишу имя класса, это сработает, но выдает ошибку!

Я искал связанные с этим в stack, но мне не разъяснили.

Почему я получаю ошибку и как ее удалить?

 #include<iostream>
using namespace std;

class Bit;    
class Nibble; 
class Byte;   

Bit bito;   //Object for Bit
Nibble no;  //Object for Nibble
Byte byteo; //Object for Byte

class Bit
{
    public:

    static int count;
    static int bit[100000];

    void add()
    {
        bit[count  ]=2;
    }
    void check()
    {
        int k=0;
        if(count)
        {
            for(int i=0;i<count;i  )
            {
                if(--bit[i]==0)
                {
                    no.add();
                    k  ;
                }

            }
            int n=k;
            int i=0;
            while(n-->0)
            {
                bit[i]=bit[i 1];
                i  ;
            }
            count-=k;
        }
    }


};

int Bit::count=0;
int Bit::bit[100000]={0};
bito.add();

class Nibble
{
    public:

    static int count;
    static int nibble[100000];

    void add()
    {
        nibble[count  ]=8;
    }
    void check()
    {
        int k=0;
        if(count)
        {
            for(int i=0;i<count;i  )
            {
                if(--nibble[i]==0)
                {
                    byteo.add();
                    k  ;
                }

            }
            int n=k;
            int i=0;
            while(n-->0)
            {
                nibble[i]=nibble[i 1];
                i  ;
            }
            count-=k;
        }
    }


};

int Nibble::nibble[100000]={0};
int Nibble::count=0;

class Byte
{
    public:

    static int count;
    static int byte[100000];

    void add()
    {
        byte[count  ]=16;
    }
    void check()
    {
        int k=0;
        if(count)
        {
            for(int i=0;i<count;i  )
            {
                if(--byte[i]==0)
                {
                    bito.add();
                    bito.add();
                    k  ;

                }

            }
            int n=k;
            int i=0;
            while(n-->0)
            {
                byte[i]=byte[i 1];
                i  ;
            }
            count-=k;
        }
    }


};

int Byte::count=0;
int Byte::byte[100000]={0};
  

Комментарии:

1. Никаких сожалений и никакого другого способа, поэтому я использовал вспомогательные функции.

Ответ №1:

Простой ответ заключается в том, что вы не можете — объявление forward declaration (как вы делаете) только позволяет компилятору узнать, что класс с указанным вами именем существует; это ничего не сообщает компилятору о классе (например, о его размере), и, следовательно, компилятор не может создавать экземпляры объектов этого типа до тех пор, пока он не будет проанализирован в объявлениях классов их классов. Итак, вам нужно будет объявить ваши три объекта после объявления их класса.

Комментарии:

1. что вы подразумеваете под синтаксическим анализом?

2. Благодаря Джереми Фризнеру теперь я понял ошибку.