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

ここに2つのファイルがあります。 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

コードの何が問題になっていますか?

4

3 に答える 3

2

宣言のRigiBool型RigiBool operator==(const CharArray&) const;がヘッダー「array.h」「chartype.h」のいずれかで定義されていないと仮定すると、型の定義を含むヘッダーを含める必要があります。「object.h」を確認してください。それも。ヘッダーファイルが(ポインターや参照ではなく)クラス型変数の値を使用する場合は、クラス定義を含むヘッダーをインクルードすることをお勧めします。それ以外の場合は、単純な前方宣言で十分です。

于 2012-05-29T19:27:04.377 に答える
1

タイプRigiBoolRigiObjectおよびObjPtrはchararray.hでは使用できません object.h(およびCCHeader.hが含まない場合は他に定義されているもの)を含める必要ありますRigiBool-object.hについて同様ですRigiBoolRigiFalse

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

:で仮想メンバー関数を定義する場合RigiObjectは、デストラクタvirtualも宣言する必要があります

:すでにdヘッダーにガードが含まている#includeので、ディレクティブの周りにガードを配置する必要はありません。#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"   
...
于 2012-06-21T10:23:05.323 に答える
1

小さな情報から言うのは難しいですが、私は?RigiBoolの派生クラスであると思います。RigiObjectここで参照するときRigiBoolchararray.hRigiObject基本クラスを知っている必要がありますが、RigiObjectについても知っている必要がありますRigiBool。したがって、派生を知らずに基本クラスを宣言することはできませんRigiBool。フォワード宣言がサイクルを壊すのRigiBoolに役立つかどうか試してください。object.h

于 2012-06-21T09:19:54.093 に答える