2016-08-04 1 views
-4

Bonjour J'ai besoin d'accéder aux données de DataContainer à la classe Derived by Base. Je ne peux pas simplement rendre ces données publiques parce que j'utilise cette classe là où elle ne devrait pas être accessible.Accès aux données privées vers une autre classe sans ami C++

Je pourrais utiliser juste un ami mais ensuite je dois faire des accesseurs pour les classes dérivées dans la classe de base. Cela le rendra inextensible.

#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... 
    } 

}; 

Ma question est comment accéder à ces données sans le rendre public ou ami.

MISE À JOUR

Ce answer ne me aide pas parce que ami ne me fait pas mal. J'essaie juste d'éviter d'écrire des lignes de code par un mouvement intelligent. je pouvais écrire quelque chose comme ceci:

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

class Base 
{ 
DataContainer* dataContainer; 

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

Mais quand j'ajouter des vecteurs dans DataContainer je vais devoir mettre à jour cette classe.

+0

Eh bien maintenant tout dans 'DataContainer' est privé donc il est inaccessible à tout le monde. – NathanOliver

+0

Oui. Cela devrait être protégé. Edité – Bezifabr

+1

Cela n'aide toujours pas. C'est toujours inaccessible. Il doit être public ou vous devez fournir des accesseurs. – NathanOliver

Répondre

1

Le pire bidouille que j'ai jamais vu pour cela dans le code de test est quelque chose comme ceci:

#define private public 
#include "the_class_i_want_to_hack.h" 

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

Je recommande évidemment pas ...

+1

c'est tellement beau et aussi terrifiant! Je voudrais au moins ajouter un #undefine après l'inclusion. –

0

Si vous connaissez la structure du DataContainer vous pourriez abuser des pointeurs et arithmétique pointeur

pour votre DataContainer cela fonctionnerait:

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(); 
}