在单个向量中打印不同派生 class 对象的变量
Printing variables of different derived class objects inside a single vector
所以我有这个简单的代码,其中包含一个基础 class 和 2 个派生的 classes。每个派生 class 都有自己的变量,基础 class 有一个 id 变量,它应该与我从派生 classes.
创建的所有元素共享
创建 2 个对象并将它们添加到向量中后,我只能打印它们的 ID。有什么办法可以从相应的元素中获取 a 和 b 变量? (例如:std::cout << items[0]->a;
)
class Item
{
public:
int id;
Item(int id) { this->id = id; }
};
class ItemTypeA : public Item
{
public:
int a;
ItemTypeA(int a, int id) : Item(id) { this->a = a; }
};
class ItemTypeB : public Item
{
public:
int b;
ItemTypeB(int b, int id) : Item(id) { this->b = b; }
};
int main()
{
std::vector<std::shared_ptr<Item>> items;
items.push_back(std::make_unique<ItemTypeA>(2, 0));
items.push_back(std::make_unique<ItemTypeB>(3, 1));
std::cout << items[0]->// I wanna print the a variable but it only lets me print the ID;
return 0;
}
一种可能的解决方案是使用 virtual
函数,如下例所示。查看下面的 Print()
方法...
class Item
{
public:
int id;
Item(int id) { this->id = id; }
virtual void Print(std::ostream& os) { os << id << " "; }
};
class ItemTypeA : public Item
{
public:
int a;
ItemTypeA(int a, int id) : Item(id) { this->a = a; }
void Print(std::ostream& os) override { Item::Print( os ); os << a << std::endl; }
};
class ItemTypeB : public Item
{
public:
int b;
ItemTypeB(int b, int id) : Item(id) { this->b = b; }
void Print(std::ostream& os) override { Item::Print( os ); os << b << std::endl; }
};
int main()
{
std::vector<std::shared_ptr<Item>> items;
items.push_back(std::make_unique<ItemTypeA>(2, 0));
items.push_back(std::make_unique<ItemTypeB>(3, 1));
for ( auto& el: items ) { el->Print(std::cout); }
}
所以我有这个简单的代码,其中包含一个基础 class 和 2 个派生的 classes。每个派生 class 都有自己的变量,基础 class 有一个 id 变量,它应该与我从派生 classes.
创建的所有元素共享创建 2 个对象并将它们添加到向量中后,我只能打印它们的 ID。有什么办法可以从相应的元素中获取 a 和 b 变量? (例如:std::cout << items[0]->a;
)
class Item
{
public:
int id;
Item(int id) { this->id = id; }
};
class ItemTypeA : public Item
{
public:
int a;
ItemTypeA(int a, int id) : Item(id) { this->a = a; }
};
class ItemTypeB : public Item
{
public:
int b;
ItemTypeB(int b, int id) : Item(id) { this->b = b; }
};
int main()
{
std::vector<std::shared_ptr<Item>> items;
items.push_back(std::make_unique<ItemTypeA>(2, 0));
items.push_back(std::make_unique<ItemTypeB>(3, 1));
std::cout << items[0]->// I wanna print the a variable but it only lets me print the ID;
return 0;
}
一种可能的解决方案是使用 virtual
函数,如下例所示。查看下面的 Print()
方法...
class Item
{
public:
int id;
Item(int id) { this->id = id; }
virtual void Print(std::ostream& os) { os << id << " "; }
};
class ItemTypeA : public Item
{
public:
int a;
ItemTypeA(int a, int id) : Item(id) { this->a = a; }
void Print(std::ostream& os) override { Item::Print( os ); os << a << std::endl; }
};
class ItemTypeB : public Item
{
public:
int b;
ItemTypeB(int b, int id) : Item(id) { this->b = b; }
void Print(std::ostream& os) override { Item::Print( os ); os << b << std::endl; }
};
int main()
{
std::vector<std::shared_ptr<Item>> items;
items.push_back(std::make_unique<ItemTypeA>(2, 0));
items.push_back(std::make_unique<ItemTypeB>(3, 1));
for ( auto& el: items ) { el->Print(std::cout); }
}