Die Sprache Java hat keine Zeiger. Sonst könnte man die gleichen "lustigen" Sachen wie in C++ machen.
Die Sprache Java hat keine Zeiger. Sonst könnte man die gleichen "lustigen" Sachen wie in C++ machen.
Kurze Frage:
Wie würde ich in c++ ein Klasse bzw Interface (also pure virtuelle Klasse) IWriteable erzeugen das dafür sorgt das jede Klasse die es implementiert in einen Stream eingespeist werden kann. Also die Funktion std::ostream& operator<< (std::ostream& os, IWriteable w) implementieren muss. Wenn ich richtig sehe meckert das Ding deswegen rum, und irgendwo hieß es glaub das man die operation nicht in eine Klasse schreiben kann oder sowas?
Im Grunde ließe sich das ganze wohl auch über eine eigene Funktion write() machen, dachte aber über operator<< würde es sauberer sein...
Edith: Hab glaub eine Idee...
op<< in IWriteable nebendran übergibt einer Methode write() die jede writeable Klasse hat den Stream und die Klasse führt dann in write die Einspeisung in den Stream aus und op<< returned den stream...
Geändert von [VK] (05. Juni 2014 um 20:22 Uhr)
Brauchst du dynamische Polymorphie? Oder reicht statische? Weil dann verwende lieber Templates.
Im Grunde ja bräuchte ich, bzw ich wüsste jetzt nicht wie ich das ganze "sauber" machen würde mit templates
In file included from src\Map.hpp:7:0,
from src\main.cpp:4:
src\IWriteable.hpp: In function 'std::ostream& operator<<(std::ostream&, const I
Writeable&)':
src\IWriteable.hpp:13:16: error: passing 'const IWriteable' as 'this' argument o
f 'virtual const void IWriteable::write(std::ostream&)' discards qualifiers [-fp
ermissive]
w.write(os);
Wenn ich das const bei std::ostream& operator<< (std::ostream& os, const IWriteable& w) { w.write(os); return os; } wegmache verschwindet der Fehler. Sehe ich richtig das es annimmt das write() die variable w ändert und deswegen rummeckert? Hieße, wenn ich ihm sage das write als Funktion nichts ändert ist er ruhig?
Du hast ja oben schon einen Weg beschrieben: Jede Klasse muss eine bestimmte Methode (z.B. write) implementieren. Diese Methode wird dann von
std::ostream& operator<< (std::ostream&, const IWriteable*)
aufgerufen.
Hmm, hab jetzt das Problem das op<< jedesmal definiert wird obwohl ich #pragma once in der Datei hab...
Gibt's eine bessere Möglichkeit als die op<< Funktion in eine eigene Datei zu schreiben?
Statt #pragma once lieber sowas machen:
#ifndef DATEINAME_H
#define DATEINAME_H
// Hier dann der Code
#endif
Das funktioniert unabhängig vom Compiler. DATEINAME steht dabei für den Dateinamen. Am besten auch stets groß schreiben.
Ist sowas eigentlich sinnvoll?
Reiner Header:
public:
virtual ~IGenerator() { };
std::shared_ptr<Map> map;
Der shared_ptr wird ja "automatisch" gelöscht und braucht keine explizite Löschung, das macht im Zweifel auch der leere Dekonstruktor. Also im Header den Dekonstrukter bei einer puren virtuellen Klasse definieren...
Und eh, gibt's mit shared_ptr eine Möglichkeit this zu übergeben?
Wenn ich zbs Eine Klasse World hab, und auf dieser Klasse existieren zbs eine Object Cat und Mouse. Die Cat kann ja ohne Zugriff auf die World nicht erfahren wo die Mouse ist. deshalb muss World.tick() { cat.tick(this); mouse.tick(this) } aussehen. Zumindest war das mein Gedanke, damit die Cat nachschauen kann wo sich die Maus befindet. Einen Pointer in der Klasse Cat auf World würde ich eher ungerne speichern
Du kannst aber Cat mitteilen (durch Übergabe von geeigneten Werten), wie weit Mouse entfernt ist, und in welcher Richtung. Weder Cat noch Mouse müssen alles über World wissen, deswegen am besten auch nicht World als Parameter übergeben.
Hmm, ok ist ein Argument, dann muss aber World wissen was Cat braucht. Wenn Cat es selbst noch nicht weiß weil das zbs erst beim Aufrufen des ticks bekannt wird (schlafen oder Maus jagen) funktioniert das ganze ja nicht ohne alle Potentiellen Möglichkeiten zu übergeben. Höchstens irgendwie über eine Funktion das World Cat fragt was Cat machen wird, und dann die Aktion auf Cat aufruft. Da muss jetzt World über Cat "inneres" Bescheid wissen was mir garnicht gefällt
Wäre es da nicht sinnvoller Cat und Mouse nicht in World zu speichern?