007
03.03.2009, 19:05 Uhr
0xdeadbeef
Gott (Operator)
|
Dass es in zwei verschiedenen Übersetzungseinheiten ist, ist doch völlig belanglos. Wichtig ist, dass Form1 eine Membervariable test hat, auf die Form2 zugreifen kann. Teil's halt auf:
C++: |
// unit1.hpp #ifndef INCLUDED_UNIT1_HPP #define INCLUDED_UNIT1_HPP
struct Unit1 { int test;
void init_test(); };
#endif
|
C++: |
// unit1.cpp #include "unit1.hpp"
void Unit1::init_test() { test = 42; }
|
C++: |
// unit2.hpp #ifndef INCLUDED_UNIT2_HPP #define INCLUDED_UNIT2_HPP
#include "unit1.hpp" struct Unit2 { int x;
void get_test_from(Unit1 const &u1); };
#endif
|
C++: |
// unit2.cpp #include "unit2.hpp"
void Unit2::get_test_from(Unit1 const &u1) { x = u1.test; }
|
C++: |
// main.cpp #include "unit1.hpp" #include "unit2.hpp"
int main() { Unit1 u1; Unit2 u2;
u1.init_test; u2.get_test_from(u2); }
|
Das mit der statischen Variable wird nicht funktionieren, jede Übersetzungseinheit erhält so ihre eigene test-Instanz. Dass die Definition in einem Header steht, ist ohne Belang, schließlich fügt #include bloß Text ein. Außerdem ist die Benutzung einer globalen Variable konzeptionell unschön, weil sie zu Unit1 gehört, und praktisch unschön, weil auf die Art alle Instanzen von Unit1 die selbe Variable benutzen würden und sich dabei ständig in die Haare kämen.
Außerdem schreibt man Objekte ohne externe Linkage in C++ üblicherweise nicht als static, sondern in den namenlosen Namensraum. -- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra Dieser Post wurde am 03.03.2009 um 19:07 Uhr von 0xdeadbeef editiert. |