继承类如何访问存储在基类容器中的数据?

时间:2016-01-06 06:19:00

标签: c++

我试图从多个继承的类访问基类容器中的数据。我以前在静态向量和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();
}

在此示例中,两个方法都尝试访问相同的向量,但它们似乎正在创建/访问自己的容器副本。任何和所有建议都非常感激。

3 个答案:

答案 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%)编写这样的代码。

代码是不合理的。

派生类不需要在基类中获取私有成员的任何引用。