Klasse als "Quasi"-Member in cpp-Datei?

14/05/2016 - 13:06 von Heinz-Mario Frühbeis | Report spam
Hallo,

wahrscheinlich ist es im Betreff nicht richtig beschrieben, deshalb
zuerst ein kleiner Umriss:

h-Datei A1 --
class A1{
private:
std::string mName;
public:
std::string Name();
};

cpp-Datei A1 --
std::string A::Name(){
return this->mName;
}

h-Datei A --
class A{
public:
std::string Name()
};

cpp-Datei A --
std::string A::Name(){
return ?; // Hier wàre der "Kasus Knaktus" [1]
}

Wie kann man nun in A.cpp A1 so einbinden, daß man direkten Zugriff hat?

Z.Z. mache ich es so <vereinfacht>:

h-Datei A --
class A{
public:
A();
std::string Name()
};


cpp-Datei A --
#include "A1.h"
#include <vector>

std::vector <std::pair <A*, A1*>> vec;

A::A(){
A1 *newA1 = new A1;
vec.push_back(this, newA1);
}

std::string A::Name(){
for(int i = 0; i < (int) vec.size(); i++){
if(vec[i].first == this) return vec[i].second.Name();
}
return "";
}

Diese Vorgehensweise könnte aber ausarten, "frisst" aber auf jeden Fall
Prozessor-Zeit.
Vielleicht gibt es ja eine andere, bessere Methode in A.cpp auf A1.h
zugreifen zu können...
Und noch das Warum..., ich möchte, daß A.h extern inkludierbar ist, aber
nicht A1.h...

Mit Gruß
Heinz-Mario Frühbeis
 

Lesen sie die antworten

#1 Stefan Reuther
18/05/2016 - 21:46 | Warnen spam
Am 14.05.2016 um 15:06 schrieb Heinz-Mario Frühbeis:
cpp-Datei A --
#include "A1.h"
#include <vector>

std::vector <std::pair <A*, A1*>> vec;

A::A(){
A1 *newA1 = new A1;
vec.push_back(this, newA1);
}

std::string A::Name(){
for(int i = 0; i < (int) vec.size(); i++){
if(vec[i].first == this) return vec[i].second.Name();
}
return "";
}




Du beschreibst nicht, welches Problem du eigentlich lösen willst.

Meine Glaskugel meint, dass du vermutlich das pimpl-Idiom suchst, das
unter verschiedenen Namen im Umlauf ist
(https://en.wikipedia.org/wiki/Opaque_pointer).

Ansonsten wàre das Mittel zur Wahl zur Reduktion des
Prozessorzeitbedarfs wenigstens das Ersetzen des vector<pair<A*,A1>>
durch eine map<A*,A1*> oder unordered_map<A*,A1*>.


Stefan

Ähnliche fragen