Wie kann man das compiler-Fehler "- Klasse hat kein Mitglied mit dem Namen "X"?
Ich bin derzeit Kodierung einer Ausdrucksauswertung und habe ein Problem bezüglich der Polymorphie.
Meine Klasse Hierarchie ist wie folgt: Teilen Sie erbt von Betreiber, erbt von der Basisklasse Ausdruck. Wenn ich instanziieren ein Objekt des Typs Dividieren mit base Klasse Ausdruck und versuchen, Zugriff auf die Funktion divide(int, int) bekomme ich die folgende Fehlermeldung:
"Expression.cpp: In member function 'int-Ausdruck::evaluate()':
Ausdruck.cpp:37:6: Fehler: "class Ausdruck' has no member named 'divide'"
Ist hier "Ausdruck.h"
#ifndef EXPRESSION_H
#define EXPRESSION_H
#include <string>
using namespace std;
class Operator;
class Divide;
class Expression
{
protected:
char **ana, *exp;
public:
Expression();
~Expression();
Expression(char* ex);
int evaluate();
void tokenize();
class EmptyException
{
public:
EmptyException(string a){reason = a;};
string getReason() const{return reason;};
private:
string reason;
};
};
#endif
- Und hier ist "Expression.cpp"
#include "Expression.h"
#include "Stack.h"
#include "Queue.h"
#include "Node.h"
#include <iostream>
#include <cstring>
#include <stdio.h>
#include <ctype.h>
#include "Operator.h"
#include "Divide.h"
Expression::Expression()
{
}
Expression::~Expression()
{
delete [] exp;
}
Expression::Expression(char* ex)
{
exp = ex;
//tokenize();
}
int Expression::evaluate()
{
Stack stack;
Expression *tmp;
Divide d;
tmp = &d;
tmp->divide(4, 2);
stack.push(tmp);
tmp = stack.pop();
}
void Expression::tokenize()
{
int space = 0;
for(int i =0 ; i < strlen(exp); i++)
{
if(exp[i] == ' ')
space++;
}
char ** ana = new char*[space + 1];
ana[0] = strtok(exp, " ");
for(int i = 1 ; i < space + 1; i++)
{
ana[i]= strtok (NULL, " ");
}
}
Und jetzt " - operator.h"
#ifndef OPERATOR_H
#define OPERATOR_H
#include "Expression.h"
using namespace std;
class Operator : public Expression
{
protected:
bool unary, binary;
public:
Operator();
bool isUnary() const;
bool isBinary() const;
};
#endif
"Operator.cpp"
#include "Operator.h"
#include <string>
#include <cmath>
#include "Expression.h"
Operator::Operator()
{
}
bool Operator::isUnary() const
{
if(unary)
return true;
else
return false;
}
bool Operator::isBinary() const
{
if(binary)
return true;
else
return false;
}
"Teilen.h"
#ifndef DIVIDE_H
#define DIVIDE_H
#include <string>
#include "Operator.h"
class Expression;
using namespace std;
class Divide : public Operator
{
private:
char id;
public:
Divide();
Divide(char);
int divide(int a, int b);
char identity() const;
};
#endif
"Divide.cpp"
#include "Divide.h"
int Divide::divide(int a, int b)
{
return a/b;
}
Divide::Divide(char _id)
{
id = _id;
}
char Divide::identity() const
{
return id;
}
und für den Fall, das makefile
main: Expression.o Equation.o Operator.o Divide.o Stack.o Queue.o main.o
g++ -static main.o Equation.o Expression.o Operator.o Divide.o Stack.o Queue.o -o main
main.o : main.cpp
g++ -c main.cpp
Equation.o : Equation.cpp Equation.h
g++ -c Equation.cpp
Expression.o : Expression.cpp Expression.h
g++ -c Expression.cpp
Operator.o : Operator.cpp Operator.h Expression.h
g++ -c Operator.cpp
Divide.o : Divide.cpp Divide.h Operator.h
g++ -c Divide.cpp
Stack.o : Stack.cpp Stack.h Node.h
g++ -c Stack.cpp
Queue.o : Queue.cpp Queue.h Node.h
g++ -c Queue.cpp
Habe ich ausgelassen, alle anderen Operatoren, wie zB. Plus, minus, etc, weil Sie alle identisch zu dem, was Teilen ist und nur noch verkomplizieren würden diese Frage noch weiter.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist ziemlich klar, oder?
Expression
nicht die Methodedivide
.Auch... warum würden Sie dies tun? Was ist falsch mit:
Dein problem ist, dass Sie anrufen
divide
auf die variable namenstemp
was ist ein Zeiger auf einExpression
hier:tmp->divide(4, 2);
sollten Sie rufen teilen auf Ihred
variable.tmp
ist immer noch ein Zeiger auf eineExpression
...