Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

endless

Treue Seele

  • »endless« ist der Autor dieses Themas

Beiträge: 230

Wohnort: Bad Schussenried

Beruf: Full Stack Developer

  • Private Nachricht senden

1

22.06.2017, 16:07

[C++] Property Class. Auf einem anderen Weg zum Ziel

Ich würde gerne eine einfache Property Klasse schreiben und bin auch soweit dass die Klasse das macht was ich möchte. Leider muss ich feststellen das mir mein Editor (clion), wohl aufgrund irgendwelcher IDE Bugs oder Fehler meinerseits, 2 Zeilen rot makiert obwohl ich ohne Probleme bauen kann.

Hier erstmal der Code:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
class Person {
private:
  int age = 0;

public:
  Person() {};
  
  void setAge(int v) { age = v; }
  
  int getAge() { return age; }
};

template<typename TType, typename TClass>
class Property {
private:
public:
  typedef TType(TClass::*GetterFunction)();
  typedef void (TClass::*SetterFunction)(TType);
  
  std::function<TType(void)> get;
  std::function<void(TType)> set;
  
  const char* name = "";
  const char* description = "";
  
  Property(const char* name,
           const char* description,
           TClass* instance,
           GetterFunction getterFunction,
           SetterFunction setterFunction) : name(name), description(description) {
    set = std::bind(setterFunction, instance, std::placeholders::_1); // <- Error
    get = std::bind(getterFunction, instance); // <- Error
  }
};

int main() {
  
  Person michael;
  Property<int, Person> age("Age", "Age in years", &michael, &Person::getAge, &Person::setAge);
  
  std::cout << age.get() << '\n';
  age.set(27);
  std::cout << age.get() << '\n';
  
  return 0;
}


(Link)


Weil mich der Fehler stört komme ich jetzt zu meiner eigentlich Frage. Kann ich das ganze auch anders lösen?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

22.06.2017, 16:12

Mein genereller Tipp für sowas: std::function.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

endless

Treue Seele

  • »endless« ist der Autor dieses Themas

Beiträge: 230

Wohnort: Bad Schussenried

Beruf: Full Stack Developer

  • Private Nachricht senden

3

22.06.2017, 16:18

std::function verwende ich ja als Typ für die get und set Felder. Oder meinst du ich soll std::function auch als Parameter nutzen?

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

4

22.06.2017, 16:37

Ich hatte mal das selbe Problem mit std::make_unique. Viel mehr als das Problem zu melden wird dir da nicht übrig bleiben.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

22.06.2017, 16:52

std::function verwende ich ja als Typ für die get und set Felder.
Wo denn? Ich sehe da nirgendwo std::function. Ich sehe da ein function-typedef, was nicht dasselbe ist.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

6

22.06.2017, 16:55

Du kannst es mit einem Lambdaausdruck versuchen.
@endless: Bluecobold meint vermutlich, dass du statt dem expliziten Übergeben von Instanz und Methodenzeigern auch einfach das gesamte Konstrukt mit einer std::function implementieren solltest:

C-/C++-Quelltext

1
2
3
4
//...
Person p;
std::function<void(blub)> setter = [&p](blub b) { p.set(b); }
//...

endless

Treue Seele

  • »endless« ist der Autor dieses Themas

Beiträge: 230

Wohnort: Bad Schussenried

Beruf: Full Stack Developer

  • Private Nachricht senden

7

22.06.2017, 17:34

Ich hatte mal das selbe Problem mit std::make_unique. Viel mehr als das Problem zu melden wird dir da nicht übrig bleiben.

Ich werde mich aufjedenfall mal bei Jetbrains melden.

endless

Treue Seele

  • »endless« ist der Autor dieses Themas

Beiträge: 230

Wohnort: Bad Schussenried

Beruf: Full Stack Developer

  • Private Nachricht senden

8

22.06.2017, 17:35

std::function verwende ich ja als Typ für die get und set Felder.
Wo denn? Ich sehe da nirgendwo std::function. Ich sehe da ein function-typedef, was nicht dasselbe ist.


C-/C++-Quelltext

1
2
  std::function<TType(void)> get;
  std::function<void(TType)> set;


Verwende ich dass hier dann falsch oder wieso kommst du darauf dass ich kein std::function verwende?

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »endless« (22.06.2017, 18:10)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

22.06.2017, 19:58

Ah, da. Warum kuddelst du das so durcheinander? Nutz doch einfach überall std::function. Also auch in Zeile 17, 18, 29 und 30.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige