在给定 属性 的情况下计算具有不同对象的列表中的元素
Counting elements in a list with different objects given a property
所以我得到了这两个 类,我想计算我的列表中带有玫瑰花的 FlowersGarden 对象的数量:
class Garden {
private:
string owner;
double lenght, width;
public:
Garden(string ow, double l, double w) {
this->ownder = ow;
this->lenght = l;
this->width = w;
}
class FlowersGarden: public Garden {
private:
string species;
public:
FlowersGarden(string ow, double l, double w, string sp):Garden(ow, l, w) {
this->species = sp;
}
string GetSpecies()const {return species;};
};
main.cpp
Graden** list;
list = new Garden* [5];
list[0] = new Garden("asdas", 54, 57);
list[1] = new FlowersGarden("tyyty", 98, 87, "rose");
list[2] = new FlowersGarden("asdasd", 578, 212, "sadas");
list[3] = new Garden("uyiyui", 687, 212);
int count = 0;
for (int i = 0; i < 4; i++)
if(dynamic_cast<FlowersGarden*>(list[i]))
if(list[i]->GetSpecies() == "rose")
count++;
只有我能想到解决这个问题,但我收到了这个错误:"class 'Garden' has no member named 'GetSpecies'" 我知道为什么,但我不知道其他方法。
if(dynamic_cast<FlowersGarden*>(list[i]))
此守卫正确验证派生类型是 FlowerGarden
类型。但是,list[0]->GetSpecies
仍在使用 Garden
类型的指针,它没有您要使用的函数。
你只需要保留转换的结果并用它来调用函数。例如:
if (FlowersGarden* result = dynamic_cast<FlowersGarden*>(list[i]))
{
if (result->GetSpecies() == "rose")
{
...
}
}
注意: 正如@max66 在评论中指出的那样。您发布的代码似乎有 FlowersGarden
class、GetSpecie
与 GetSpecies
.
函数的拼写错误
编辑:
我不确定您最终要做什么(关于您的 class 层次结构),但我认为指出 virtual
函数是恰当的。如果你的情况是有一个函数适用于 all 派生的 classes 那么你应该添加它基础 class 并使其成为 virtual
。通过这样做,执行 dynamic_cast
的需要是不必要的,动态调度将在通过基 class 指针调用时调用派生的 class 实现。
例如:
#include <iostream>
#include <memory>
class Base
{
public:
virtual ~Base() {}
virtual void print() const = 0; // Pure abstract function
};
class Derived : public Base
{
public:
virtual void print() const override { std::cout << "Derived\n"; }
};
int main()
{
std::unique_ptr<Base> base = std::make_unique<Derived>();
base->print();
return 0;
}
输出:
Derived
所以我得到了这两个 类,我想计算我的列表中带有玫瑰花的 FlowersGarden 对象的数量:
class Garden {
private:
string owner;
double lenght, width;
public:
Garden(string ow, double l, double w) {
this->ownder = ow;
this->lenght = l;
this->width = w;
}
class FlowersGarden: public Garden {
private:
string species;
public:
FlowersGarden(string ow, double l, double w, string sp):Garden(ow, l, w) {
this->species = sp;
}
string GetSpecies()const {return species;};
};
main.cpp
Graden** list;
list = new Garden* [5];
list[0] = new Garden("asdas", 54, 57);
list[1] = new FlowersGarden("tyyty", 98, 87, "rose");
list[2] = new FlowersGarden("asdasd", 578, 212, "sadas");
list[3] = new Garden("uyiyui", 687, 212);
int count = 0;
for (int i = 0; i < 4; i++)
if(dynamic_cast<FlowersGarden*>(list[i]))
if(list[i]->GetSpecies() == "rose")
count++;
只有我能想到解决这个问题,但我收到了这个错误:"class 'Garden' has no member named 'GetSpecies'" 我知道为什么,但我不知道其他方法。
if(dynamic_cast<FlowersGarden*>(list[i]))
此守卫正确验证派生类型是 FlowerGarden
类型。但是,list[0]->GetSpecies
仍在使用 Garden
类型的指针,它没有您要使用的函数。
你只需要保留转换的结果并用它来调用函数。例如:
if (FlowersGarden* result = dynamic_cast<FlowersGarden*>(list[i]))
{
if (result->GetSpecies() == "rose")
{
...
}
}
注意: 正如@max66 在评论中指出的那样。您发布的代码似乎有 FlowersGarden
class、GetSpecie
与 GetSpecies
.
编辑:
我不确定您最终要做什么(关于您的 class 层次结构),但我认为指出 virtual
函数是恰当的。如果你的情况是有一个函数适用于 all 派生的 classes 那么你应该添加它基础 class 并使其成为 virtual
。通过这样做,执行 dynamic_cast
的需要是不必要的,动态调度将在通过基 class 指针调用时调用派生的 class 实现。
例如:
#include <iostream>
#include <memory>
class Base
{
public:
virtual ~Base() {}
virtual void print() const = 0; // Pure abstract function
};
class Derived : public Base
{
public:
virtual void print() const override { std::cout << "Derived\n"; }
};
int main()
{
std::unique_ptr<Base> base = std::make_unique<Derived>();
base->print();
return 0;
}
输出:
Derived