我正在尝试在另一个类中设置基类和派生类的数组。例如,我有基类:
class Base{
public:
Base() {};
Base(float kv) : param(kv) {}
~Base() {};
float getParam() { return param; }
void setParam(bool kv) { param= kv; }
protected:
float param;
};
和派生类如:
class Derived1: public Base{
public:
Derived1() {};
Derived1(float kv) : Base(kv) {}
~Derived1() {};
};
现在,在另一个类中,我有一个Base类型的数组。
class Hive{
public:
Hive() {};
Hive(...) : ... {}
~Hive() {};
...
float getSomethingFromArray();
...
void setB();
protected:
...
Base *b[7];
};
现在,setB()
实例化数组,如:
b[0] = new Derived1();
但是当我尝试访问b [0]的方法时,它将不起作用。 当我称之为方法时:
b[0].setParam(i);
编译器报告此错误
IntelliSense:表达式必须具有类 键入c:\ users \ miller \ documents \ visual studio 2010 \ projects \ hello \ hello \ objekat.h 139 2你好
答案 0 :(得分:5)
但是当我尝试访问b [0]的方法时,它将不起作用。有什么想法吗?
b[0]
是Base*
。编译器不知道它指向的对象的实际类型是Base
,Derived1
还是Derived42
,这就是为什么它只允许你从Base
调用方法的原因在它上面 - 因为它是唯一可以保证存在的。
我猜你正在尝试从Derived1
调用方法:
b[0] = new Derived1();
//...
b[0]->getSomethingFromArray();
但请注意,您的代码很容易被替换为:
b[0] = new Base();
//...
b[0]->getSomethingFromArray();
现在怎么样?要使其正常工作,您可以使用强制转换并将b[0]
强制转换为您需要的类型(前提是您已确定)。如果你的类是多态的,你可以使用dynamic_cast
,它也会进行检查,以确保你投射到正确的类型(研究这个)。
或者,您可以简单地利用多态性(只有在您的特定情况下才有意义)。
答案 1 :(得分:1)
你的错误非常简单,要通过指针调用方法,你必须使用->
运算符 - 而不是点.
:
不是这样的:
b[0].setParam(i);
但是这样:
b[0]->setParam(i);