2016-11-30 6 views
0

Dies könnte mir ein dummes Problem sein. Aber ich bekomme das konzeptionelle Problem nicht im Programm.Conceptual Verwirrung

Ich mag aus verschiedenen Teilen des Projektes nur den Zeiger der Klasse Kind in einer globalen Funktion und Zugriff, den Zeiger Objekt zu übergeben, indem Child.h

Problem: das folgende Problem nicht funktioniert wenn ich get_Child() -> number_1 im Hauptteil mache.

Lösung: wenn ich den Child.cpp im Haupt umfassen und Inline den Constructor oder wenn ich den Konstruktor in dem Child.h statt Child.cpp

Query-Anfrage erklären. Was ist der Grund für dieses Verhalten? Eine Art und Weise, wie ich den Konstruktor in Child.cpp erklären kann und muss nicht Child.cpp in der main.cpp

main.cpp

#include <iostream> 
#include "Child.h" 
//#include "Child.cpp" 

using namespace std; 

int main(){ 

    Child *pC = new Child(); 
    cout << "direct = " << pC->number_1 << endl; 

    cout << "with function = " << get_Child()->number_1 << endl; 

} 

Child.h

#ifndef CHILD_H_ 
#define CHILD_H_ 


class Child; 
static Child * pointer_Child; 

inline void save_Child(Child * p_C){ 
    pointer_Child = p_C; 
} 

inline Child * get_Child(){ 
    return pointer_Child; 
} 


class Child { 
public: 

    Child(); 

    //Child(){ 
    // this ->set_Child(); 
    //} 

    void set_Child(){ 
     save_Child(this); 
    } 

    int number_1 = 10; 
}; 

#endif /* CHILD_H_ */ 
umfassen

Child.cpp

#include "Child.h" 

//inline Child::Child(){ 
// this ->set_Child(); 
//} 

Child::Child(){ 
    this->set_Child(); 
} 
+0

Verwenden Sie einen Linker. Ich kann mir kein Anfänger-C++ - Buch vorstellen, das nicht mit der Beschreibung der drei Teile des Programmaufbaus beginnt: Präprozessor, Compiler, Linker. –

Antwort

2

Sie erklären nicht statische Variablen in einem Header (außerhalb von Klassen) lik e dies:

static Child * pointer_Child; 

Es erstellt eine Variable in jeder Kompilierungseinheit, die die Kopfzeile enthält. Und sie sind von außerhalb der Übersetzungseinheit nicht zugänglich.

Stattdessen machen pointer_Childextern und eine Implementierung in der CPP lauten wie folgt:

Rubrik:

extern Child* pointer_Child; 

CPP:

Child* pointer_Child; 

Und nie eine CPP-Datei enthalten.

+0

Vielen Dank .. :) –