2016-05-02 6 views
-1

У меня есть базовый класс и производные классы. Полученный вектор содержит вектор объектов, а output_two содержит вектор строк. Я подталкиваю объекты к вектору deriver_one и строкам к выведенному вектору.Атрибут класса аргументов

class Base{ 
    public: 
     virtual void Greetings(){ cout << " I am base class " << endl;} 
     virtual string getName(){ return "base";} 
     virtual vector<string>* getStr() { return NULL; } 
     virtual bool operator == (Base *); 
}; 
class Derived_one : public Base{ 
    public: 
     virtual void Greetings(){ cout << " I am derived one " << endl;} 
     virtual string getName(){ return "one";} 
     virtual bool operator == (Base *); 
    private: 
    vector<Base*> m; 
}; 
class Derived_two : public Base{ 
    public: 
     virtual void Greetings(){ cout << " I am derived two " << endl;} 
     virtual string getName(){ return "two";} 
     virtual vector<string>* getStr() { return &str; } 
    private: 
    vector<string> str; 
}; 

Однако я хотел бы сравнить два экземпляра производных классов, я определен

bool Derived_one:: operator ==(Base *a){ 
    for(size_t i = 0; i < m.size(); i++){ 
     if(m[i] -> getStr()){ 
     for(unsigned int j = 0; j < m[i] -> getStr() ->size(); j++){ 
      if((*(m[i] -> getStr()))[j] != a -> (*(m[i] -> getStr()))[j]){ 
       return false; 
      } 
     } 
     } 
    } 
} 
error: expected unqualified-id before '(' token| 

в reffers ошибки в линии

if((*(m[i] -> getStr()))[j] != a -> (*(m[i] -> getStr()))[j] 

Почему компилятор жалуется здесь? Возвращаемый указатель getStr(), который будет разыменован *. Аргумент a здесь является типом указателя. Здесь есть корень проблемы? Я не могу найти ответа на этот вопрос. Спасибо

+0

Какая линия делает ошибки см? – Quentin

+0

if ((* (m [i] -> getStr())) [j]! = A -> (* (m [i] -> getStr())) [j] – Darlyn

+1

'a -> (* (m [i] -> getStr())) [j] 'действительно синтаксически недействителен: справа от' -> 'должно быть имя члена' * a'. Что вы пытаетесь выразить? – Quentin

ответ

3

Неверное значение вашего выражения a->(*(m[i] -> getStr()))[j], правая сторона -> должна быть своего рода именем.

Я предполагаю, что вы хотите (* (а-> т [я] -> getStr())) [J]

Хотя это тоже было бы ошибкой, поскольку Base не содержит ни одного члена m, возможно, вы хотите к делу a к Derived_one* например (*(dynamic_cast<Derived_one*>(a)->m[i] -> getStr()))[j]?

Это не сработает, если a не указывает на объект Derived_one. Вы можете проверить это перед рукой, например typeid(Derived_one) == typeid(*a); (Хотя это не сработает, если *a происходит от, Derived_one (я не знаю, как это исправить).

Вы также опечатку j <m[i]->getstr() должен быть j <m[i]->getStr() Ваш код не может возвращать значение (если return false заявление не ударил), это не определено поведение, я предлагаю добавить return true заявление в конце вашей функции.

Вы, вероятно, также wan't аргумент к == оператора должен быть константным ссылка не указатель. Making эти изменения приведут к этому коду:

bool Derived_one:: operator ==(const Base& a) { 
    if (typeid(Derived_one) != typeid(a)) 
     return false; 
    for (size_t i = 0; i < m.size(); i++) { 
     if (m[i]->getStr()) { 
      for (unsigned int j = 0; j <m[i]->getStr()->size(); j++) { 
       if ((*(m[i]->getStr()))[j] != (*(dynamic_cast<const Derived_one&>(a).m[i]->getStr()))[j]) { 
        return false; 
       } 
      } 
     } 
    } 
    return true; 
} 
+0

Использование этого компилятора не будет жаловаться, но когда я пытаюсь сравнить два экземпляра, например (a == b), компилятор жалуется на «отсутствие соответствия для оператора ==», так как аргумент будет оставаться. Появится базовая и фрагментация объектов. – Darlyn

+0

@trolkura Я обновил свой ответ сейчас, попробуйте мой новый код. – Isaac

+0

Это хорошо работает на сегодняшний день, однако, когда я пытаюсь сравнить размер двух векторов, он вызывает seg fault, например size_t first = properties.size(); size_t two = a.getVec() -> size(); где getVec - это такая же функция, как getStr(), но вместо str он возвращает m – Darlyn

1

Помимо нескольких опечаток в вашем коде (: вместо;, отсутствует; для завершения строки, getstr вместо getStr), вам нужно только динамическое преобразование a в Derived_one * и контролировать, чтобы результат не был нулевым. Это сила dynamic_cast: если исходный указатель нельзя отнести к правильному классу, вы просто получите нуль, чтобы вы могли его протестировать. Ваш код может затем стать (при условии, что вы хотите, чтобы тест был (*(m[i] -> getStr()))[j] != (*(b -> m[i] -> getStr()))[j]):

bool Derived_one:: operator ==(Base *a){ 
    Derived_one* b = dynamic_cast<Derived_one *>(a); 
    if (b == nullptr) return false; // no need to process further 
    for(size_t i = 0; i < m.size(); i++){ 
     if(m[i] -> getStr()){ 
     for(unsigned int j = 0; j <m[i] -> getstr() -> size(); j++){ 
      if((*(m[i] -> getStr()))[j] != (*(b -> m[i] -> getStr()))[j]){ 
       return false; 
      } 
     } 
     } 
    } 
    return true; 
} 
+0

. Спасибо за ответ, этот алгоритм выдает ошибку «нет совпадения для операнда ==» – Darlyn

+0

@trolkura: Это реализация. Оператор должен быть объявлен в объявлении класса: 'class Derived_one: public Base { public: ... bool operator == (Base * a); ...}; ' –

+0

Я действительно объявил это в классе, и ошибка все еще возникает – Darlyn

Смежные вопросы