2012-05-29 4 views
0

Я хочу, чтобы скомпилировать Rigi исходный код, но я получаю ошибку во время компиляции:Недоступный объект при компиляции кода

adt/object.h: At global scope: 
adt/object.h:35:18: error: ‘class RigiObject RigiObject::RigiObject’ is inaccessible 
adt/chararray.h:51:13: error: within this context 
make: *** [cl_arcflags.o] Error 1 

Вот наши два файла. object.h:

#ifndef OBJECTH 
#define OBJECTH 1 

#include <stdio.h> 
#ifndef STREAM_H 
#include <iostream> 
#endif 
#ifndef __STRING_H 
#include <string.h> 
#endif 
#ifndef __STDLIB_H 
#include <stdlib.h> 
#endif 
#ifndef _CCHEADER_H_ 
#include "CCheader.h" 
#endif 

extern char* indent_line(int); 

class RigiObject; 
typedef RigiObject* ObjectPtr; 

#define Oberr(a) fprintf(stderr,"ERROR :: Generic Object Routine Called :: %s\n","a"); 

class RigiObject { 
    public: 
    RigiObject() {/*Oberr(RigiObject)*/;} 
    ~RigiObject() {/*Oberr(~RigiObject)*/;} 

    // Routines that are really described by the Derived Classes 
    virtual int Printout(int) const 
     {Oberr(printout); return (int) 0;} 
    virtual unsigned int Hash() const 
     {Oberr(hash); return (unsigned int) 0; } 
    virtual RigiBool isEqual(void* a) const 
     {Oberr(isEqual); a = NIL; 
      (void) abort(); 
     return (RigiBool) RigiFalse;} 
    virtual void Delete_class(ObjectPtr) 
     {Oberr(delete_type);} 
    virtual void* Create_class(); 
    virtual void* Duplicate_class(); 

}; 

#endif 

и chararray.h:

#ifndef CHARARRAYH 
#define CHARARRAYH 

#ifndef ARRAYOBIDH 
#include "array.h" 
#endif 
#ifndef CHARTYPEH 
#include "chartype.h" 
#endif 

class CharArray; 
typedef CharArray* CharArrayPtr; 

class CharArray : public Array { 
    int slot; 
    public: 
    // Routines to initialize and destroy the class. 
    CharArray(unsigned int size = CLTN_DEFAULT_CAPACITY); 
    CharArray(const CharArray&); 
    ~CharArray(); 

    // Functions that are Required to Use this Class as an Object 

     // .... all routines the same as in Class Array....... 

    // Routines that are required by a Collection class and derived classes 
    // of Collections. [See Array Class for these routines.] 

    virtual unsigned int size() const {return slot;} 

     // .... all routines the same as in Class Array....... 

    // Routines specific to this class 
    void operator=(const CharArray&); 
    RigiBool operator==(const CharArray&) const; 
    void Create(char*); 
    void Create(char*,int); 
    void Create(int, char*); 
    void Add(char*); 
    void Add(CharType&); 
    void Addob(RigiObject& ob) 
     {Array::Add(slot++,&ob);} 
    void Append(char*); 
    char* Concat(char); 
    int FindIndex(char*); 
    char* Remove() 
     {return ((CharTypePtr)Array::Remove(--slot))->string();} 
    ObjectPtr Pop() 
     {return (Array::Remove(--slot));} 
    ObjectPtr Look(int i) 
     {return (Array::At(i));} 
    void Empty(); 
    virtual unsigned int Size() const 
     {return slot;} 
    char* Peek(); 
    char* At(int); 
}; 

#endif 

Что случилось с кодом?

+0

Что такое линия 35? –

+0

У нас есть класс класса RigiObject {... 'в строке 35 –

ответ

1

RigiBool Типы, RigiObject и ObjPtr не доступны в chararray.h: вам необходимо включить object.h (плюс все остальное определяет RigiBool если CCHeader.h не делает) - аналогично для RigiBool и RigiFalse в object.h

// somewhere at the top of chararray.h 
#include "object.h" 

Примечание: если определить виртуальный FUNC член нениями RigiObject, вы должны объявить деструктор virtual а

Примечание: У вас уже есть включать охранники в в #include d заголовки, нет необходимости ставить их вокруг #include директивы - делать не указано иное (ложно ваш случай), что вы делаете условное компиляция

//chararray.h 
#ifndef CHARARRAYH 
#define CHARARRAYH 

#include "array.h" 
#include "chartype.h" 
... 

//object.h 
#ifndef OBJECTH 
#define OBJECTH 

#include <stdio.h> 
#include <iostream> 
#include <string.h> 
#include <stdlib.h> 
#include "CCheader.h" 
... 
+0

У меня есть ссылка на' object.h' в других связанных файлах. Я пробовал это раньше. –

+0

@Afshin - '' Array' вытекает из 'RigiObject' или _CCheader.h_ include _chararray.h_ (возможно, косвенно)? – Attila

2

Предполагая, что тип RigiBool в объявлении RigiBool operator==(const CharArray&) const; не определен в одном из заголовков «array.h» «chartype.h» Я думаю, вы должны включить заголовок, содержащий определение типа, и просто чтобы убедиться, что «object.h» тоже. В случаях, когда заголовочный файл использует значения переменных типа класса (не указатели и ссылки), рекомендуется включать заголовки, содержащие определение класса. В противном случае достаточно простого прямого объявления.

1

Трудно сказать из небольшой информации, но я бы предположил, что RigiBool является производным классом RigiObject? Когда вы теперь ссылаетесь на RigiBool в chararray.h, он должен знать базовый класс RigiObject, но RigiObject также должен знать о RigiBool. Таким образом, вы не можете объявить базовый класс, не зная полученного RigiBool. Попробуйте, если форвардное объявление RigiBool в object.h помогает сломать цикл.