c++ наследование не определен базовый класс

264
05 марта 2018, 00:49

Есть базовый класс:

class csymbol
{
public:
    enum_symbol_type type;
    enum_keywords kw;
    enum_operations op;
    string ident;
    cvalue value;
};

От него наследуется класс

class cvalue : public csymbol
{
public:
    const_types type;
    int cint;
    double creal;
    char cchar;
    string cstring;
    bool cbool;
};

При сборке получаю ошибку Ошибка C2504 csymbol: не определен базовый класс. Что я делаю не так?

Answer 1

Конфигурация классов бессмысленна. Класс csymbol включает класс cvalue в качестве подобъекта, а класс cvalue включает класс csymbol в качестве подобъекта. Это невозможно, ибо представляет собой бесконечно рекурсивную структуру данных.

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

Не пытайтесь создавать структуры данных с циклическим включением подобъектов - это невозможно. И не пытайтесь делать циклическое включение заголовочных файлов - это ничего не даст.

Answer 2

Добавьте перед классами предварительные объявления:

class csymbol;
class cvalue;

Попробуйте вместо

cvalue value;

использовать

cvalue *value;

Вот этот код у меня скомпилировался:

#include "stdafx.h"
#include <string>
using namespace std;
#define const_types int
enum enum_symbol_type{a,b};
enum enum_keywords{c,d};
enum enum_operations{e,f};

class csymbol;
class cvalue;
class csymbol
{
public:
    enum_symbol_type type;
    enum_keywords kw;
    enum_operations op;
    string ident;
    cvalue* value;
};

class cvalue : public csymbol
{
public:
    const_types type;
    int cint;
    double creal;
    char cchar;
    string cstring;
    bool cbool;
};
int _tmain(int argc, _TCHAR* argv[])
{
 cvalue value;
 csymbol symbol;
    return 0;
}
Answer 3

тут нет классов - это обычные структуры данных, и нагляднее их обьявлять как структуры. Оставьте в базовом классе только string ident; если компилируется, то по очереди включайте остальные (конечно кроме cvalue value; ), тогда узнаете где у вас ошибка.

P.S. я не вижу смысла в этом наследовании...

READ ALSO
Как убрать множество массивов в один массив, чтоб передать в функцию?

Как убрать множество массивов в один массив, чтоб передать в функцию?

Есть массивы, динамические двумерные, которые формируются в результате математических операцийМне надо несколько массивов объединить в один...

253
c++ работа с файлами

c++ работа с файлами

Когда вывожу в файл данные (язык - c++), через fstream, они появляется в нём только после того, как я этот файл закрою (то есть, если ofstream file, то информация...

230
Массив с множеством key+value

Массив с множеством key+value

Мне нужен вектор, в который будут передаваться массивы с множеством ключей, это можно сделать через структуру:

243
Дерево отрезков запрос суммы [требует правки]

Дерево отрезков запрос суммы [требует правки]

Нужно реализовать дерево отрезков с присваиванием на отрезке + запрос суммы (разумеется с ленивым проталкиванием)

179