参数类的属性

时间:2016-05-02 08:55:52

标签: c++ pointers polymorphism

我有一个基类和派生类。派生的一个包含对象的矢量,derived_two包含字符串的矢量。我将对象的deriver_one向量和字符串推送到derived_two向量。

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|

错误引用行

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

为什么编译器在这里抱怨? getStr()返回指向vector的指针,它将被*取消引用。 a as参数是指针类型。什么是问题的根源?我没有找到任何答案。 感谢

2 个答案:

答案 0 :(得分:3)

表达式a->(*(m[i] -> getStr()))[j]的部分无效,->的右侧应该是某种名称。

我猜你想要的是什么(*(a-&gt; m [i] - &gt; 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语句从未被命中),这是未定义的行为,我建议在函数末尾添加==语句。

你可能还想让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; } 运算符的参数成为const引用而不是指针。 进行这些更改将产生以下代码:

.dll

答案 1 :(得分:1)

除了你的代码中的多个拼写错误(:而不是;缺少;结束一行,gettr而不是getStr),你需要的只是动态转换aDerived_one *并控制结果不为null。这就是dynamic_cast的强大功能:如果原始指针无法强制转换为正确的类,则只需获取null即可进行测试。然后你的代码就会变成(假设你要测试的是(*(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;
}