none
Probleme Instanz einer Klasse in einen vector oder eine ArrayList zu befördern RRS feed

  • Frage

  • Hallo allerseits,

    ich bastle gerade an einer WinForms-Anwendung mit VC++ Express 2008. Dabei bin ich jetzt auf folgendes Problem gestossen:

    Ich habe eine verwaltete Klasse erstellt (CParameter). Eine einzelne Instanz lässt sich ohne Probleme erstellen und benutzen.

    Jetzt möchte ich beliebig viele Instanzen von CParameter in einen vector oder meinetwegen auch eine ArrayList stecken.


    Code:
     private: void initializeParameterVector()
                  {
                      vector<CParameter^> parameterVector;
                      CParameter^ prm();
                      parameterVector.push_back(prm);                 
                  }
     


    Wenn ich das jedoch probiere, erhalte ich jedoch eine Fehlermeldung:

    error C2664: 'std::vector<_Ty>::push_back': Konvertierung des Parameters 1 von 'CParameter ^(__clrcall *)(void)' in 'CParameter ^const &' nicht möglich

    Ich habe schon probiert prm explizit als System::Object^ zu casten, leider auch ohne Erfolg. Bei der ArrayList tritt der selbe Fehler auf.

    Kann mir jemand helfen?

    Danke schonmal,

    PaRoX
    Mittwoch, 3. Februar 2010 10:44

Antworten

  • Ich habe es mittlerweile hinbekommen - indem ich statt "std::vector" die "System::Collections::Generic::List" verwendet habe.

    Vielen Dank soweit,

    Raphael
    Mittwoch, 3. Februar 2010 13:16

Alle Antworten

  • CParameter^ prm(); 
    

    Ist kein Objekt. Sondern damit definierst Du eine Funktion prm, die ein CParameter^ handle zurück gibt.
    CParameter^ prm = gcnew CParameter;
    parameterVector.push_back(prm);                  

    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Mittwoch, 3. Februar 2010 11:15
    Moderator
  • Vielen Dank Martin.

    Jetzt ist leider ein zweites Problem aufgetaucht. Ich habe jetzt noch den Code meiner Klasse und die komplette Fehlerbschreibung angefügt:

    ------ Erstellen gestartet: Projekt: Spielwiese, Konfiguration: Debug Win32 ------
    Kompilieren...
    Spielwiese.cpp
    C:\Programme\Microsoft Visual Studio 9.0\VC\include\xmemory(52) : error C3698: "CParameter ^": Dieser Typ kann nicht als Argument von "new" verwendet werden.
            Meinten Sie "CParameter" (ohne ''^'' auf oberster Ebene)?
            C:\Programme\Microsoft Visual Studio 9.0\VC\include\xmemory(155): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "void std::_Construct<CParameter^,_Ty>(_T1 *,const _T2 &)".
            with
            [
                _Ty=CParameter ^,
                _T1=CParameter ^,
                _T2=CParameter ^
            ]
            C:\Programme\Microsoft Visual Studio 9.0\VC\include\xmemory(154): Bei der Kompilierung der  Klassen-template der void std::allocator<_Ty>::construct(CParameter ^*,const _Ty &)-Memberfunktion
            with
            [
                _Ty=CParameter ^
            ]
            C:\Programme\Microsoft Visual Studio 9.0\VC\include\vector(429): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "std::allocator<_Ty>".
            with
            [
                _Ty=CParameter ^
            ]
            C:\Programme\Microsoft Visual Studio 9.0\VC\include\vector(439): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "std::_Vector_val<_Ty,_Alloc>".
            with
            [
                _Ty=CParameter ^,
                _Alloc=std::allocator<CParameter ^>
            ]
            c:\visual studio projekte\spielwiese\spielwiese\Form1.h(360): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "std::vector<_Ty>".
            with
            [
                _Ty=CParameter ^
            ]
    C:\Programme\Microsoft Visual Studio 9.0\VC\include\xmemory(52) : error C3828: 'CParameter': Positionierungsargumente sind während des Erstellens von Instanzen von verwalteten Klassen nicht zulässig
    Das Buildprotokoll wurde unter "file://c:\Visual Studio Projekte\Spielwiese\Spielwiese\Debug\BuildLog.htm" gespeichert.
    Spielwiese - 2 Fehler, 0 Warnung(en)
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========

    Meine Klasse:

    Parameter.h

    #pragma once

    using namespace System;
    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Windows::Forms;
    using namespace System::Data;
    using namespace System::Drawing;
    using namespace System::IO;
    using namespace System::IO::Ports;
    using namespace System::Windows;


    ref class CParameter
    {
    public:
        CParameter();
       
        String^ strDescription;
        String^ strCommand;
        int* intValues;
        int intLength;
       
        void setParameter(String^ strDescr, String^ strComm, int intLgth);
    };

    und die Parameter.cpp :

    #include "StdAfx.h"
    #include "Parameter.h"

    CParameter::CParameter()
    {
        intValues = new int[16];   
    }

    void CParameter::setParameter(String^ strDescr, String^ strComm, int intLgth)
            {
                strDescription = strDescr;
                strCommand = strComm;
                intLength = intLgth;
            }
    Mittwoch, 3. Februar 2010 12:46
  • Ich habe es mittlerweile hinbekommen - indem ich statt "std::vector" die "System::Collections::Generic::List" verwendet habe.

    Vielen Dank soweit,

    Raphael
    Mittwoch, 3. Februar 2010 13:16
  • Genau... man sollte sich als Regel setzen: *Niemals* Managed und Unmanaged Code vermischen... und wenn man nicht weiss WAS WAS ist, dann sollte man C# nehmen!
    Jochen Kalmbach (MVP VC++)
    Mittwoch, 3. Februar 2010 18:47