gpt4 book ai didi

c++ - 访问子类 C++ 的属性/函数

转载 作者:行者123 更新时间:2023-11-28 07:41:47 25 4
gpt4 key购买 nike

我的程序存在设计问题,因为我偶尔需要访问所有存储在基类指针 vector 中的子类的属性和方法。我的代码看起来像这样:

class B1;
class B2;
class Base {
private:
int id, a, b;

public:
virtual int getA() { return a; }
virtual int getB() { return b; }
virtual B1 *getB1() { return NULL; } //seems like a bad idea
virtual B2 *getB2() { return NULL; } //to have these two functions
Base(int newId) { id = newId; }
};

class B1 : public Base {
private:
int x;

public:
int getX() { return x; }
B1 *getB1() { return this; }
};

class B2 : public Base {
private:
int y;

public:
int getY() { return y; }
B2 *getB2() { return this; }
};

class Thing {
private:
std::vector<Base*> bases;

void addBase(Base *base) { bases.push_back(base); }
void doB1Stuff();
void doB2Stuff();
void setAandB(int ID, int newA, int newB); //set a and b of one of the elements in bases vector based upon the id given
};

问题是如果我需要访问 Thing 中的 x 或 y,如下所示:

void Thing::doB1Stuff() {
for(std::vector<Base*>::iterator it = bases.begin(); it != bases.end(); ++it) {
if (it->getB1()) {
//do stuff with b1
}
}
}

上面的代码应该可以工作,但如果这看起来不是个好主意,因为在使用 B1/B2 属性之前很容易忘记检查指针是否为空:

void Thing::doB2Stuff() {
for(std::vector<Base*>::iterator it = bases.begin(); it != bases.end(); ++it) {
std::cout << it->getY(); //I believe this will crash the program if a NULL pointer is returned
}
}

因此我的问题是:什么是访问子类属性的好方法?我正在考虑为 Thing 中的 B1 和 B2 使用两个单独的 vector ,但这似乎也不是一个好主意,因为我需要能够轻松设置 a 和 b。有什么想法吗?

最佳答案

您所拥有的完全没问题:只要您不将 NULL 存储在指针的 bases vector 中,就无需对值进行空值检查从迭代器返回。不幸的是,指针 vector 是多态对象容器的唯一选择。您可以创建一个共享指针 vector 来简化删除处理,但基本思想保持不变。

关于c++ - 访问子类 C++ 的属性/函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15709500/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com