我有一个基类和派生类。派生的一个包含对象的矢量,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参数是指针类型。什么是问题的根源?我没有找到任何答案。
感谢
答案 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),你需要的只是动态转换a
到Derived_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;
}