Forum: PC-Programmierung C++ dll erstellen-> Keine Klasse oder Namespace


von C Programmierer (Gast)


Lesenswert?

Hallo,

ich möchte eine C++ dll in VS2010 erstellen.

Eine Klassendeklaration funktioniert auch. Wenn ich allerdings den 
Konstruktor einfüge gibt es einen Fehler.

>> error C2653: 'Class1': Keine Klasse oder Namespace
1
// MyLib.h
2
3
#pragma once
4
5
using namespace System;
6
7
namespace MyLib {
8
9
  public ref class Class1
10
  {
11
  public:
12
    int var;
13
    Class1(int var);
14
  };
15
}

1
// Dies ist die Haupt-DLL.
2
// MyLib.cpp
3
4
#include "stdafx.h"
5
6
#include "MyLib.h"
7
8
Class1::Class1(int var)  // error C2653: 'Class1': Keine Klasse oder Namespace
9
{
10
  this->var = var;
11
}


Weiß jemand worad das liegt? Im Internet habe ich nur ähnliche Fälle 
gefunden und leider keine Lösung gefunden. In einem normalen C++ 
Programm funktioniert das so (ohne den Namespace). Aber in der DLL und 
mit dem Namespace will er das so nicht akzeptieren.

von C++ Programmierer (Gast)


Lesenswert?

Ich nehme an, die Definition des Konstruktors muss im gleichen Namespace 
wie die Klasse sein.

von Tom (Gast)


Lesenswert?

In MyLib.cpp ist nichts davon zu sehen, dass Class1 im Namespace MyLib 
wohnt.

von C Programmierer (Gast)


Lesenswert?

Ach, das hätt ich ja eigentlich auch selbst drauf kommen können. Bisher 
war der Konstruktor im Niemandsland implementiert.

So funktioniert es:
1
// Dies ist die Haupt-DLL.
2
// MyLib.cpp
3
4
#include "stdafx.h"
5
6
#include "MyLib.h"
7
8
9
namespace MyLib {
10
11
  Class1::Class1(int var)
12
  {
13
    this->var = var;
14
  }
15
}

Vielen Dank an Euch!!!

von C Programmierer (Gast)


Lesenswert?

Ich schmeiß nochmal eine Frage hinterher. Wie geht man jetzt am besten 
mit den Verweisklassen um? Diese brauche ich ja, um die DLL in meinem C# 
Projekt verwenden zu können.

Wenn ich in meiner Klasse eine Methode schreibe, die den eigenen Typ 
zurückgibt, z.B.
1
Class1 Class1::GetCopy(void)
2
  {
3
    return Class1(var);
4
  }

... dann erhalte ich die Fehlermeldung

>> error C3073: "MyLib::Class1": Die Verweisklasse hat keinen benutzerdefinierten
>> Kopierkonstruktor.


Wenn ich so einen Kopierkonstruktor nach 
https://de.wikipedia.org/wiki/Kopierkonstruktor erstelle, erhalte ich 
wiederum eine Fehlermeldung.
1
Class1::Class1(const Class1& c)
2
  {
3
    this->var = c.var;
4
  }

>> error C3699: "&": Diese Referenzierung kann nicht für den Typ "const 
MyLib::Class1" verwendet werden.


Die Alternative dazu wäre dieses gcnew und ^ - Gedöns immer 
mitzuschreiben. 
(https://msdn.microsoft.com/de-de/library/vstudio/Ff429376.aspx)
1
  Class1^ Class1::GetCopy(void)
2
  {
3
    return gcnew Class1(var);
4
  }

So kann die DLL in C# verwendet werden.

Mir wäre die erste Wahl natürlich lieber, wenn ich nur einmalig so einen 
Kopierkonstruktor implementieren müsste, und den Rest, wie in einer 
nativen Klasse implementieren könnte. Was ist hierbei die gängige 
Vorgehensweise? Welche Wahl ist evtl. mit weniger Rechenleistung 
belastet?

von Planlos (Gast)


Lesenswert?

C Programmierer schrieb:
> Die Alternative dazu wäre dieses gcnew und ^ - Gedöns immer
> mitzuschreiben.

Du solltest dir als allererstes im Klaren sein, welche 
Programmiersprache du verwenden willst.

C++ und C++/CLI ("Managed C++") sind zwei grundverschiedene Dinge, auch 
wenn die Namensähnlichkeit anderes suggeriert.

Wenn du dich für C++ entscheidest, dann bleib bei der "reinen" 
C++-Syntax.

Wenn du dich für .NET und damit C++/CLI entscheidest, dann such dir zum 
Copy&Paste aus dem Internet am besten auch .NET - Tutorials, keine C++ - 
Tutorials.

von KarlssonVomDach (Gast)


Lesenswert?

C Programmierer schrieb:
>>> error C3073: "MyLib::Class1": Die Verweisklasse hat keinen
>>> benutzerdefinierten Kopierkonstruktor.

> Wenn ich so einen Kopierkonstruktor nach
> https://de.wikipedia.org/wiki/Kopierkonstruktor erstelle, erhalte ich
> wiederum eine Fehlermeldung.
> Class1::Class1(const Class1& c)
>   {
>     this->var = c.var;
>   }

Class1 ist ein .NET-Typ, keine native C++-Klasse:

public ref class Class1

Also ist die Signatur des Kopierkonstruktors:

Class1(const Class1^ & c)

http://www.functionx.com/cppcli/classes/Lesson13b.htm
http://www.functionx.com/cppcli/

Man kann eben in C++/CLI native und verwaltete Anteile frei mischen 
("mixed mode"), darum kommt man da schnell durcheinander, wenn einem die 
Grundlagen von C++ und C++/CLI noch nicht so geläufig sind.

http://blogs.msdn.com/b/abhinaba/archive/2012/11/14/c-cli-and-mixed-mode-programming.aspx

Planlos schrieb:
> Wenn du dich für C++ entscheidest, dann bleib bei der "reinen"
> C++-Syntax.

Falls der TO (aus Performance-Gründen oder zum Einbinden von nativen 
Bibliotheken in ein .NET-Programm) C++/CLI verwenden muss/will, hilft 
dieser - an sich nicht unvernünftige - Ratschlag vermutlich nicht 
weiter.

> Wenn du dich für .NET und damit C++/CLI entscheidest, dann such dir zum
> Copy&Paste aus dem Internet am besten auch .NET - Tutorials, keine C++ -
> Tutorials.

Anteile mit "nativem Code" in C++/CLI-Programmen bestehen aus ganz 
normalem C++ inkl. der neuen C++-Features.
1
#include <functional>
2
#include <iostream>
3
4
using namespace std;
5
6
int main()
7
{
8
  std::function<int(int)> fib = [&fib](int n)
9
    { return n < 2 ? 1 : fib(n - 1) + fib(n - 2); };
10
  
11
  std::cout << fib(8) << std::endl;
12
13
  return 0;
14
}

Nur für die Schnittstelle zu .NET muss man C++/CLI-Konstrukte verwenden 
(was, wenn man das Ganze sauber trennt, sicher besser als das Gefrickel 
mit P/Invoke).

von Dumdi D. (dumdidum)


Lesenswert?

Um mal nachzufragen: Bist Du sicher, Du möchtest eine C++ DLL? Wozu? Im 
Gegensatz zu C sind die DLL Bindungen doch Compilerabhängig.

von C Programmierer (Gast)


Lesenswert?

Hallo,

vielen Dank für Eure Antworten. Ich wollte eigentlich in C# weiter 
programmieren und bin da auch sehr fit. Ich möchte jedoch sehr 
rechenlastige Aufgaben in eine Maschinen-/Prozessornahe 
Programmiersprache/DLL auslagern.

Wäre eine DLL mit Referenzklassen denn überhaupt deutlich schneller als 
eine mit nativen Klassen? Bzw. ist ein Programm mit nativen Klassen 
schneller als eins mit Referenzklassen?

Nun bin ich am überlegen, vielleicht sogar komplett auf C++ umzusteigen. 
So viel schwieriger als C# kanns ja eigentlich auch nicht sein. Ob C die 
richtige Wahl ist bezweifle ich, weil ich die objektorientierte 
Programmierung doch ein bisschen einfacher/übersichtlicher finde.

Vielleicht könnte ich ja auch eine reine C++ DLL mit nativen Klassen 
erstellen und zusätzlich eine Art Schnittstellen-DLL für die Anbindung 
an C#, die die nativen Klassen in Referenzklassen forwarded? Dann wäre 
meine DLL sowohl für C++ als auch für C# verwendbar.

von Borislav B. (boris_b)


Lesenswert?

C Programmierer schrieb:
> Ich wollte eigentlich in C# weiter
> programmieren und bin da auch sehr fit. Ich möchte jedoch sehr
> rechenlastige Aufgaben in eine Maschinen-/Prozessornahe
> Programmiersprache/DLL auslagern.

Was meinst du denn, in was dein C# Code übersetzt wird?
Rrrrichtig, genauso in Maschinencode, wie C++ auch. Von daher ist C# 
genauso viel/wenig "prozessornah", wie C++.

Bis auf einige wenige Ausnahmen tut sich das Performance-mäßig nichts. 
In solche Extremfälle wirst du aber vermutlich nicht hineinlaufen...

=> Mein Tipp: Tu dir den Stress nicht an, und bleib bei C#.

von Daniel A. (daniel-a)


Lesenswert?

Jenachdem was berechnet wird könnte Multithreading und nie nutzung der 
GPU mit z.B. OpenCL einen Performancegewinn bringen.

von Stefan (Gast)


Lesenswert?

C Programmierer schrieb:
> Vielleicht könnte ich ja auch eine reine C++ DLL mit nativen Klassen
> erstellen und zusätzlich eine Art Schnittstellen-DLL für die Anbindung
> an C#, die die nativen Klassen in Referenzklassen forwarded? Dann wäre
> meine DLL sowohl für C++ als auch für C# verwendbar.


http://stackoverflow.com/questions/315051/using-a-class-defined-in-a-c-dll-in-c-sharp-code/315064#315064

Stefan

von C Programmierer (Gast)


Lesenswert?

Hallo,

ich habe einen Performance Test gemacht und C# hat dabei sogar besser 
abgeschnitten, als C++. Somit werde ich bei C# bleiben.

Vielen Dank an Euch!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.