2017-01-05 3 views
0

Hier sind einige Beispiele für Klassen, die Situation zu reproduzieren Ich bin vor:C++ Alle Zeiger als Funktionsargument

class A { 
B* seccond; 
} 
class B { 
int * number; 
} 
static NTSTATUS Read(std::uintptr_t address, size_t size, PVOID buff); 

// Let's assume we have object 'obj' which has valid address of number variable 

int buff; 
Read(obj.seccond, sizeof(int), &buff); 

Error: cannot convert argument 1 from 'int *' to 'uintptr_t' 

Ich weiß, es leicht mit behoben werden kann:

Read(std::uintptr_t(obj.seccond), sizeof(int), &buff); 

aber dies ist nicht befriedigend genug, da es die Lesbarkeit des Codes senkt und es nur hässlich ist. Ich möchte wirklich keine Vorlagen verwenden, da sie überall in meinem Code bereits vorhanden sind. Gibt es einen einfachen Container für solche Variablen? Oder eine elegantere Art, es zu tun?

EDIT: Ich habe Frage neu angepasst, sorry

+2

'std :: uintptr_t' ist kein Zeigertyp, sondern eine Ganzzahl. Implizite Konvertierung würde viele Probleme verursachen (schauen Sie sich die Geschichte von C für Beispiele an). – molbdnilo

+1

* Vorlagen sind schon überall überall in Ihrem Code * ... Machen Sie einen mehr :) –

+0

Ich weiß, aber der Fall ist, ich arbeite an anderen Prozess Adressraum, die Strukturen hält Zeiger, sobald ich sie gelesen habe, sollten sie als normal behandelt werden Uint-Werte, die an die Read-Funktion übergeben werden sollen. Also gibt es keine Möglichkeit, das zu tun? –

Antwort

1

Sie könnten Überlastung verwenden, um die Umwandlung an einem Ort zu tun

static NTSTATUS Read(const void* p, size_t size, PVOID buff) 
{ 
    return Read(std::uintptr_t(p), size, buff); 
} 
+0

Ich war so sicher, dass ich es ausprobiert habe, sorry für Problem Jungs und danke! –

1

Sie sind für uintptr_t ein int* da Ihre Funktion Warte verwenden. Einer ist signiert, der andere ist nicht signiert.

Try unsigned statt int oder versuchen zu verwenden std::intptr_t statt std::uintptr_t

EDIT zu verwenden: ein Weg, um Ihr Problem zu lösen etwas wie das sein könnte:

class B { 
    int *number; 
    operator int*() { 
     return number; 
    } 
}; 

Nach können Sie tun etwas wie: Read(*objA.second, ...);

Die Antwort von Jarod42 kann auch gut sein!

+0

Ich habe meine Frage wahrscheinlich falsch gestellt, könntest du jetzt einen Blick darauf werfen? Das Problem ist nicht signed-unsigned, aber die Konvertierung in std :: uintptr_t muss die Adresse des Objekts im Speicher enthalten. –

+0

schau dir mein Edit an und schaue auf die Antwort von @ Jarod42 :). –

0

Ich nehme an, Sie einen void-Zeiger als argument.For Beispiel verwenden:

static NTSTATUS Read(void* address, size_t size, PVOID buff); 

Aber Sie sollten wahrscheinlich ein Pass anderes Argument für die Funktion, um den Typ zu bestimmen, in den Sie die Adressvariable umwandeln sollten.So zum Beispiel:

Verwandte Themen