我试图从多个继承的类访问基类容器中的数据。我以前在静态向量和shared_ptr或unique_ptr上查看过其他stackoverflow问题但是我不确定这些是最好的前进方式(而且我不熟悉如何实现shared_ptr或unique_ptr)。请参阅下面的代码。
class Event {
public:
Event(){}
virtual ~Event(){}
std::vector<int>& testData() {return test;} // return reference.
private:
std::vector<int>test;
};
class InheritedEvent1 : public Event
{
public:
void FirstMethod(void);
};
class InheritedEvent2 : public Event
{
public:
void SecondMethod (void);
};
void InheritedEvent1::FirstMethod(void){
testData().push_back(1); // Insert data into Event vector.
std::cout << "FirstMethod: size " << testData().size() << std::endl;
}
void InheritedEvent2::SecondMethod(void){
std::cout << "SecondMethod: size " << testData().size() << std::endl;
}
int main() {
InheritedEvent1 First;
InheritedEvent2 Second;
First.FirstMethod();
Second.SecondMethod();
}
在此示例中,两个方法都尝试访问相同的向量,但它们似乎正在创建/访问自己的容器副本。任何和所有建议都非常感激。
答案 0 :(得分:0)
如果您知道希望继承类对容器执行的操作,那么最好使受保护的成员函数执行此操作,例如, addItem
而不是返回引用。另外,提供一个公共API,例如const ItemType& itemAt(int index) const;
。这样您就可以随时更改实现,例如某些其他容器而不是向量或容器上的快速缓存等。
如果您只希望派生类使用引用更新容器,这很可能会使testData
成为受保护的成员而不是公共成员。
如果要为继承的类提供所有自由,可以使vector成员变量受到保护。但是,仍然尝试提供更有帮助和受限制的公共API。
您不太可能在公共成员中返回容器引用。如果是这种情况,那么您当前的代码看起来很好。我没有看到shared_ptr或unique_ptr增加任何优势。如果您希望两个或多个对象拥有容器的所有权,shared_ptr可能会很有用,但我仍然无法理解您为什么会针对您发布的特定情况执行此操作。
答案 1 :(得分:0)
我假设您希望所有继承的类共享相同的向量。在这种情况下,基类中的静态向量是有意义的。
由于您没有描述遇到的确切问题,我只能想象您没有正确初始化此静态数据成员。
以上是上面的实现,为每次调用打印1。
#include <iostream>
#include <vector>
using namespace std;
class Event {
public:
Event(){}
virtual ~Event(){}
std::vector<int>& testData() {return test;} // return reference.
private:
static std::vector<int> test;
};
std::vector<int> Event::test;
class InheritedEvent1 : public Event
{
public:
void FirstMethod(void);
};
class InheritedEvent2 : public Event
{
public:
void SecondMethod (void);
};
void InheritedEvent1::FirstMethod(void){
testData().push_back(1); // Insert data into Event vector.
std::cout << "FirstMethod: size " << testData().size() << std::endl;
}
void InheritedEvent2::SecondMethod(void){
std::cout << "SecondMethod: size " << testData().size() << std::endl;
}
int main() {
InheritedEvent1 First;
InheritedEvent2 Second;
First.FirstMethod();
Second.SecondMethod();
}
答案 2 :(得分:0)
您可以编写这样的代码,但不应该这样做。
我认为你不需要在大多数时间(99.9999%)编写这样的代码。
代码是不合理的。
派生类不需要在基类中获取私有成员的任何引用。