2016-08-04 15 views
-4

Hallo Ich muss auf Daten von DataContainer zu Abgeleitet von Basisklasse zugreifen. Ich kann diese Daten nicht einfach öffentlich machen, weil ich diese Klasse dort verwende, wo sie nicht zugänglich sein sollte.Zugriff auf private Daten zu anderen Klasse ohne Freund C++

Ich könnte nur Freund verwenden, aber dann muss ich Accessoren für abgeleitete Klassen in der Basisklasse machen. Dies wird es unaussprechlich machen.

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

}; 

Meine Frage ist, wie man auf diese Daten zugreifen kann, ohne sie öffentlich oder Freund zu machen.

UPDATE

Diese answer hilft mir nicht, weil Freund mich nicht verletzt. Ich versuche nur zu vermeiden, Codezeilen mit smart move zu schreiben. konnte ich nur so etwas schreiben:

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

class Base 
{ 
DataContainer* dataContainer; 

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

Aber wenn ich mehr Vektoren in Datacontainer hinzufügen Ich werde diese Klasse aktualisieren.

+0

Nun, im Moment ist alles in 'DataContainer' privat, so dass es nicht für jeden zugänglich ist. – NathanOliver

+0

Ja. Es sollte geschützt werden. Bearbeitet – Bezifabr

+1

Das hilft immer noch nicht. Es ist immer noch nicht zugänglich. Es muss öffentlich sein oder Sie müssen Accessoren bereitstellen. – NathanOliver

Antwort

1

Das Schlimmste Hack ich je für diese in Test-Code gesehen habe, ist so etwas wie dieses:

#define private public 
#include "the_class_i_want_to_hack.h" 

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

Ich würde es natürlich nicht empfehlen ...

+1

das ist so schön und auch so furchterregend! Ich würde mindestens ein #undefine nach dem Include hinzufügen. –

0

, wenn Sie die Struktur der Datacontainer kennen Sie könnten Zeiger und Zeiger arithmetics missbrauchen

für Ihre Datacontainer dies funktionieren würde:

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