从 child 获取变量
Get variable from child
我有一个水果 class 和一个继承水果的苹果。
假设我有一系列不同种类的水果。我可以说苹果、香蕉和其他水果。
问题:当我尝试从该数组的一个元素(child 个水果)获取值时,它无法编译。
class Fruit{
public:
Fruit();
}
class Apple : public Fruit{
public:
Apple();
int count; //number of apples in the store
}
int main(){
Fruit market[3];
market[0] = Apple();
int apples = market[0].count;
}
我知道这是因为程序不知道它正在看一个苹果;但是,如果我确实知道它是一个苹果(例如通过检查),我该如何访问 Apple.count?
你不能这样做。数组是一串线性字节,它存储一个相邻的对象。因此,它们都必须具有相同的大小。由于 Apple 不适合 Fruit 占用的 space,因此您不能将 Apple 存储在用于 Fruit 的数组槽中。
您可以做的是存储一个指针数组。这是保持多态类型的常用解决方案:
std::array<Fruit*, 3> market;
market[0] = new Apple();
// ...
delete market[0];
由于指针在一个程序中通常具有单一大小,因此通过指针存储不同的类型是明智的。您也可以像这样使用 C++ "smart pointers,":
std::array<std::unique_ptr<Fruit>, 3> market;
market[0].reset(new Apple());
// ...
// delete is called automatically
现在,如果您需要访问 count
,您有两种选择。如果你确定 market[0]
是一个 Apple
,你可以使用这个:
static_cast<Apple&>(market[0]).count
如果您不确定,可以查看:
if (Apple* apple = dynamic_cast<Apple*>(&market[0])) {
// use apple->count
} else {
// it's not an Apple
}
but if not every fruit has a count (the market is a bad example here) – RIJIK 25 secs ago
那你倒霉了。你需要垂头丧气。并更改为某种形式的引用语义。
我有一个水果 class 和一个继承水果的苹果。
假设我有一系列不同种类的水果。我可以说苹果、香蕉和其他水果。
问题:当我尝试从该数组的一个元素(child 个水果)获取值时,它无法编译。
class Fruit{
public:
Fruit();
}
class Apple : public Fruit{
public:
Apple();
int count; //number of apples in the store
}
int main(){
Fruit market[3];
market[0] = Apple();
int apples = market[0].count;
}
我知道这是因为程序不知道它正在看一个苹果;但是,如果我确实知道它是一个苹果(例如通过检查),我该如何访问 Apple.count?
你不能这样做。数组是一串线性字节,它存储一个相邻的对象。因此,它们都必须具有相同的大小。由于 Apple 不适合 Fruit 占用的 space,因此您不能将 Apple 存储在用于 Fruit 的数组槽中。
您可以做的是存储一个指针数组。这是保持多态类型的常用解决方案:
std::array<Fruit*, 3> market;
market[0] = new Apple();
// ...
delete market[0];
由于指针在一个程序中通常具有单一大小,因此通过指针存储不同的类型是明智的。您也可以像这样使用 C++ "smart pointers,":
std::array<std::unique_ptr<Fruit>, 3> market;
market[0].reset(new Apple());
// ...
// delete is called automatically
现在,如果您需要访问 count
,您有两种选择。如果你确定 market[0]
是一个 Apple
,你可以使用这个:
static_cast<Apple&>(market[0]).count
如果您不确定,可以查看:
if (Apple* apple = dynamic_cast<Apple*>(&market[0])) {
// use apple->count
} else {
// it's not an Apple
}
but if not every fruit has a count (the market is a bad example here) – RIJIK 25 secs ago
那你倒霉了。你需要垂头丧气。并更改为某种形式的引用语义。