2016-08-04 7 views
-4

Здравствуйте, мне нужно получить доступ к данным из DataContainer в Derived by Base. Я не могу просто сделать эти данные общедоступными, потому что я использую этот класс там, где он не должен быть доступен.Доступ к личным данным другому классу без друга C++

Я мог бы использовать только друга, но тогда мне нужно сделать аксессуар для классов Derived в базовом классе. Это сделает его нерасторжимым.

#include <vector> 

class Data; // It's not important 

class DataContainer 
{ 
protected: 
     std::vector<Data> dataVector; 
     std::vector<Data> dataVector2; 
}; 


class Base 
{ 
protected: 
    DataContainer* dataContainer; 

public: 
    virtual ~Base() {}; 

    void SetDataContainer(DataContainer* dataContainer) 
    { 
     this->dataContainer = dataContainer; 
    } 

    virtual void UseDataFromVector() = 0; 
}; 

class Derived:public Base 
{ 
public: 
    virtual ~Derived() {}; 

    virtual void UseDataFromVector() 
    { 
     //And here want to use data from DataContainer... 
    } 

}; 

Мой вопрос в том, как получить доступ к этим данным, не делая их общедоступными или друзьями.

UPDATE

Это answer мне не помогает, потому что друг мне не больно. Я просто стараюсь избегать написания строк кода с помощью умного перемещения. я мог бы просто написать что-то вроде этого:

class DataContainer 
{ 
friend class Base 
std::vector<Data> dataVector; 
}; 

class Base 
{ 
DataContainer* dataContainer; 

std::vector<Data>& GetDataVector() { return dataContainer->dataVector;} 
}; 

Но когда я добавляю больше векторов в DataContainer я буду обновлять этот класс.

+0

Хорошо, сейчас все в 'DataContainer' является частным, поэтому оно недоступно для всех. – NathanOliver

+0

Да. Он должен быть защищен. Отредактировано – Bezifabr

+1

Это все равно не помогает. Он по-прежнему недоступен. Он должен быть общедоступным или вам необходимо предоставить аксессуар. – NathanOliver

ответ

1

Худшее хак я когда-либо видел для этого в тестовом коде что-то вроде этого:

#define private public 
#include "the_class_i_want_to_hack.h" 

// test case goes here, with instantiation of the hacked class and so on... 

Я бы, очевидно, не рекомендую ...

+1

Это так красиво и так страшно! Я бы по крайней мере добавил #undefine после включения. –

0

если вы знаете структуру Datacontainer вы могли бы злоупотреблять указателей и указателей арифметика

для вашего DataContainer это будет работать:

virtual void UseDataFromVector() 
{ 
    std::vector<Data>* pFirstDataContainer = reinterpret_cast<std::vector<Data>*>(dataContainer); 
    pFirstDataContainer->emplace_back(); 
    pFirstDataContainer->size(); 

    std::vector<Data>* pSecondDataContainer = ++pFirstDataContainer; 
    pSecondDataContainer->emplace_back(); 
    pSecondDataContainer->size(); 
}