2013-07-14 2 views
0
if (polynomial1->get(0)->compareTo(polynomial2->get(0)) == 0) 
{ 
    polynomial1->get(0)->coefficient += polynomial2->get(0)->coefficient; 
    result->insert_tail->polynomial1->get(0); 
} 

Polynomial1 и Polynomial2 являются связанными списками и я добавляю полиномиальные термины вместе один узел одновременно. В моей функции compareTo, если оба члена в связанных списках == 0, я хочу получить доступ к коэффициенту и добавить коэффициент для обоих терминов вместе. Моя проблема заключается в доступе к коэффициенту. Я получаю сообщение об ошибке:обращающиеся элементы данных в LinkedList

class Data has no member named ‘coefficient’

Но мой PolynomialTerm класс наследует Data. Любая помощь по доступу к коэффициенту?

class PolynomialTerm : public Data 
{ 
    public: 
    int coefficient; 
    Variable *variable; 

    PolynomialTerm(int coefficient, Variable *variable) : 
    coefficient(coefficient), variable(variable) 
    { } 

    int compareTo(Data *other) const 
    { 
     PolynomialTerm * otherTerm = (PolynomialTerm*)other; 

     return variable->variableX == otherTerm->variable->variableX && 
      variable->variableX == otherTerm->variable->variableX && 
      variable->exponentX == otherTerm->variable->exponentX && 
      variable->exponentY == otherTerm->variable->exponentY ? 0 : 
      variable->exponentX > otherTerm->variable->exponentX || 
      variable->exponentY > otherTerm->variable->exponentY ? -1 : 1; 
    } 

--- edit--

здесь также мой класс данных, который находится в моем файле заголовка.

class Data { 
    public: 
    virtual ~Data() {} 

    /** 
    * Returns 0 if equal to other, -1 if < other, 1 if > other 
    */ 
    virtual int compareTo(Data * other) const = 0; 

    /** 
    * Returns a string representation of the data 
    */ 
    virtual string toString() const = 0; 
}; 
+0

Пожалуйста, разместите определение 'Class Data'. –

ответ

1

Я полагаю, вы получаете сообщение об ошибке здесь:

polynomial1->get(0)->coefficient 

И (это опять мое предположение), это происходит потому, что функция get определена в базовом классе (Data) и возвращает указатель на Data (не PolynomialTerm). И, конечно, Data не имеет coefficient (только PolynomialTerm).

Компилятор не знает, что указатель, возвращаемый get, фактически указывает на PolynomialTerm экземпляр. Следовательно, вы получаете ошибку.

Один из способов фиксации этого будет заливка типа указателя на это фактический тип PolynomialTerm*:

dynamic_cast<PolynomialTerm*>(polynomial1->get(0))->coefficient 
+0

моя функция get фактически определена в моем связанном классе списка. get return Данные по указанному индексу. каждый узел хранит данные и в этом случае PolynomialTerm, который наследует данные. – user2510809

+0

О, я вижу. Но мое предложение все еще действует и должно работать для вас. (Возможно, создание связанного класса списка в качестве шаблона было бы более элегантным решением.) – Inspired

+0

Я попытался использовать ваше предложение, но затем я получаю это сообщение об ошибке: ошибка: не может dynamic_cast 'polyomial1-> LinkedList :: get (0)' (типа 'class Data *') для ввода 'class PolynomialTerm' (цель не указатель или ссылка) – user2510809

0
PolynomialTerm(int coefficient, Variable* variable): 
    coefficient(coefficient), variable(variable){} 

Вашего компилятор может смутить coefficient(coefficient). Измените имя аргумента или имя участника:

PolynomialTerm(int coef, Variable* var): 
    coefficient(coef), variable(var){} 
Смежные вопросы