You are not logged in.

  • Login

Dear visitor, welcome to Coder Forum. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

1

Monday, June 20th 2011, 4:18pm

Probleme mit Nutzung einer Klasseninstanz

Hallo!
Ich habe ein Problem. Wenn ich eine Klasseninstanz, aus einer Klasse welche in einer DLL steht, erstellen will, dann wird statt der Klasse das jeweilige Schlüsselwort als Klasse angesehen.
Also:
Bei mir:

C/C++ Quellcode

1
2
3
4
void Funktion() {
  MeinNamespace::DLL_SOWIEBEIMIR_API Klasseninstanz;
  ...
}

Wie es richtig sein sollte:

C/C++ Quellcode

1
2
3
4
void Funktion() {
  MeinNamespace::DLLKlasse Klasseninstanz;
  ...
}


Beim besten Willen würde ich sagen es liegt an meinem Compiler, was bestimmt auch so ist., aber ich komme mit GCC nicht klar. Jedenfalls mit dem Inkludieren von der SFML.
Ich weiß auch das ich da nicht die "normale" SFML nehmen muss.
Weiß wer Rat? Mehr Informationen habe ich nicht, denn genauso sitze ich gerade hier suchend nach Anhaltspunkten.

MfG
Check

2

Monday, June 20th 2011, 6:05pm

Das Problem wird wohl weniger der Compiler/Linker sein sonderen der Benutzer vor dem Bildschirm.

Ich versteh absolut nicht was du meinst, was ist ein Schlüsselwort bzw. wie Definierst du Schlüsselwort?

mfg Rushh0ur

3

Monday, June 20th 2011, 6:10pm

Okay, falsch ausgedrückt.
Ich meine das Makro. ;)
Wenn ich die Klasseninstanz machen möchte wird das Makro als Klasse angesehen. ?(

MfG
Check

4

Monday, June 20th 2011, 6:20pm

Ja dann hasst du irgentwas Flasch definiert, wie sieht den die Headerdatei deiner Bibliothek aus.

Mfg Rushh0ur

5

Monday, June 20th 2011, 6:38pm

Das ist bei allen Bibliotheken so! hab jetzt mal alles durchprobiert!
Bei allen so:
Makro.hpp:

C/C++ Quellcode

1
2
3
4
5
6
7
8
9
10
#ifndef SPRITE_HPP //Start des 
#define SPRITE_HPP //"Waechters".
 
#if _USRDLL //Importieren und Exportieren der DLL
 #define DLL_BEISPIEL_API _declspec(dllexport) //Makro
#else
 #define DLL_BEISPIEL_API _declspec(dllimport) //makro
#endif
 
#endif

Header.hpp:

C/C++ Quellcode

1
2
3
4
5
6
7
8
9
10
#include "Makro.hpp"
 
namespace MeinNamespace
{
  class DLL_BEISPIEL_API DLLKlasse
  {
     public:
     void Irgendwas();
  };
}


MfG
Check

6

Monday, June 20th 2011, 7:13pm

Hmm sollte eigentlich stimmen, schon versucht die Riehenfolge bei der Deklaration umzutauschen:
class DLLKlasse <-> DLL_BEISPIEL_API

Wenn ich unter VS08 eine neues DLL-Projekt erstelle wird mir folgendes vorgeneriert:

dlltest.cpp

C/C++ Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// dlltest.cpp : Definiert die exportierten Funktionen für die DLL-Anwendung.
//
 
#include "stdafx.h"
#include "dlltest.h"
 
 
// Dies ist das Beispiel einer exportierten Variable.
DLLTEST_API int ndlltest=0;
 
// Dies ist das Beispiel einer exportierten Funktion.
DLLTEST_API int fndlltest(void)
{
	return 42;
}
 
// Dies ist der Konstruktor einer Klasse, die exportiert wurde.
// Siehe dlltest.h für die Klassendefinition.
Cdlltest::Cdlltest()
{
	return;
}


dlltest.h

C/C++ Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// Folgender ifdef-Block ist die Standardmethode zum Erstellen von Makros, die das Exportieren 
// aus einer DLL vereinfachen. Alle Dateien in dieser DLL werden mit dem DLLTEST_EXPORTS-Symbol
// kompiliert, das in der Befehlszeile definiert wurde. Das Symbol darf nicht für ein Projekt definiert werden,
// das diese DLL verwendet. Alle anderen Projekte, deren Quelldateien diese Datei beinhalten, erkennen 
// DLLTEST_API-Funktionen als aus einer DLL importiert, während die DLL
// mit diesem Makro definierte Symbole als exportiert ansieht.
#ifdef DLLTEST_EXPORTS
#define DLLTEST_API __declspec(dllexport)
#else
#define DLLTEST_API __declspec(dllimport)
#endif
 
// Diese Klasse wird aus dlltest.dll exportiert.
class DLLTEST_API Cdlltest {
public:
	Cdlltest(void);
	// TODO: Hier die Methoden hinzufügen.
};
 
extern DLLTEST_API int ndlltest;
 
DLLTEST_API int fndlltest(void);


Die Klasse solltest du eigentlich ganz normal, wie du es gmeacht hasst, mit einem namespace umhüllen können.

Mfg Rushh0ur

7

Monday, June 20th 2011, 7:27pm

Dann wird ausgegeben das ein Bezeichner erwartet wird.
ich denke immer noch das es an MVC++E liegt. :S

MfG
Check

8

Tuesday, June 21st 2011, 8:51pm

Jop. Wer arbeitet denn nicht mit Microsoft Visual C++ 2010 /MVC++2010 Express und kann mir einen Compiler empfehlen und ggf. wie bei GCC erklären wie man das die SFML einbindet.
Ich bin nicht dumm, habe schon bei SFML Tutorial gelesen, bei Google das Suchfeld heißlaufen lassen aber nichts hat wirklich bei mir geklappt, weil Informationen fehlten die GCC brauch. '-.-

MfG
Check

9

Tuesday, June 21st 2011, 9:33pm

was benutzt du denn für eine IDE?
GCC is ja "nur" der compiler
Ich denke mal nicht das du alles über die Konsole eingibst

10

Wednesday, June 22nd 2011, 6:39am

Ja, ich meine natürlich Codeblocks, also MinGW, wenn ich richtig liegen sollte. :P
Ich nutze allerdings momentan ja immer noch MVCE.

MfG
Check

This post has been edited 1 times, last edit by "Checkmateing" (Jun 23rd 2011, 11:31am)


11

Thursday, June 23rd 2011, 11:32am

Hmm. ;(

MfG
Check

12

Saturday, June 25th 2011, 1:33am

Habe es jetzt selbst hin bekommen.

MfG
Check

Similar threads

Tagging

Social bookmarks