Sie können eine Klasse "weiterleiten", so dass sie vor der vollständigen Definition entweder durch einen Zeiger oder eine Referenz referenziert werden kann.
class MyClass; // forward declaration
void fn1(MyClass* ptr); // legal
void fn2(MyClass* ptr) // legal
{
ptr->something; // illegal, definition of MyClass unknown
}
class A {
MyClass mc; // illegal, definition of MyClass unknown
};
class MyClass {
// ...
};
jedoch in Ihrem Beispiel, schreiben Sie folgende:
typedef struct testStructure
{
int data;
void *TestFunction(testStructure *tempStructValue)
} temp;
dies deklariert eine Klasse, testStructure
, die als Integer Mitglied data
und eine MemberfunktionTestFunction
, die einen void*
Zeiger zurückzugibt . Diese Mitgliedsfunktion hat absolut keine Verbindung zur vorherigen, freien Funktion TestFunction
. Es ist unklar, was deine Absicht ist.
Beispiel:
#include <iostream>
struct TestStructure;
void TestFunction(TestStructure* /*unused*/) {
std::cout << "Free TestFunction\n";
}
struct TestStructure {
int i;
void TestFunction(TestStructure* /*unused*/) {
std::cout << "TestStructure TestFunction\n";
}
void foo() {
std::cout << "From foo\n";
TestFunction(this);
}
};
int main() {
std::cout << "From main:\n";
TestFunction(nullptr);
TestStructure t;
t.foo();
}
http://ideone.com/1453GG
Das gleiche gilt, wenn sie die andere Art und Weise erklärt werden um: http://ideone.com/VDcJxe
Dies liegt daran, Namen basierend auf Umfang gelöst werden. Member-Funktionen der Klasse/Struktur werden den eigenen Bereich der Klasse/Struktur konsultieren, bevor sie wo anders suchen. Wenn wir die freie Funktion aus dem Inneren einer Memberfunktion aufrufen wollten, könnten wir das nutzen ‚::‘ Bereichsoperator als solche:
void foo() {
::TestFunction(); // resolves from the global scope
}
See: http://ideone.com/B51J4C (man beachte, wählte ich die Funktion zu übermitteln erklären, was wiederum erfordert dass ich forward deklariere die Klasse für ihr Argument).
Ist das C oder C++? – merlin2011
Forward-Deklaration. – Jarod42
Bitte stellen Sie sicher, dass Sie Ihre Sprache korrekt referenzieren. Sie verwenden eindeutig C++, also verwenden Sie nicht das C-Tag, und bezeichnen Sie es nicht als "C". Sie sind zwei deutlich verschiedene Sprachen mit unterschiedlichen Idiomen. – skrrgwasme