C++ Forms Anwendung ext. Klasse benutzen

F

Furtano

Gast
Hallo,

ich schreibe grad an einer XML Klasse (XML.h).
Diese möchte ich in einer .Net-Framework Forms Anwendung (Form1.h) nutzen.
Leider bekomme ich immer den Fehler :

Fehler 2 error C3767: "XML::loadNode": Auf mögliche Funktion(en) kann nicht zugegriffen werden. c:\users\chris\documents\visual studio 2010\projects\duckxml2\duckxml2\Form1.h 74

Wie kann ich den Fehler beheben?
Danke schon mal :)



Form1.h


PHP:
#pragma once
#include "XML.h"

namespace duckXML2 {
	
	using namespace System;
	using namespace System::ComponentModel;
	using namespace System::Collections;
	using namespace System::Windows::Forms;
	using namespace System::Data;
	using namespace System::Drawing;

	
	/// <summary>
	/// Zusammenfassung für Form1
	/// </summary>
	public ref class Form1 : public System::Windows::Forms::Form
	{
	public:
		
		XML bla;
		Form1(void)
		{
			InitializeComponent();
			
			//
			//TODO: Konstruktorcode hier hinzufügen.
			//
		}

	protected:
		/// <summary>
		/// Verwendete Ressourcen bereinigen.
		/// </summary>
		~Form1()
		{
			if (components)
			{
				delete components;
			}
		}

	private:
		/// <summary>
		/// Erforderliche Designervariable.
		/// </summary>
		System::ComponentModel::Container ^components;
		
#pragma region Windows Form Designer generated code
		/// <summary>
		/// Erforderliche Methode für die Designerunterstützung.
		/// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
		/// </summary>
		void InitializeComponent(void)
		{
			this->SuspendLayout();
			// 
			// Form1
			// 
			this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
			this->ClientSize = System::Drawing::Size(284, 261);
			this->Name = L"Form1";
			this->Text = L"Form1";
			this->Load += gcnew System::EventHandler(this, &Form1::Form1_Load);
			this->ResumeLayout(false);

			 

		}
#pragma endregion
	private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) {

				bla.loadNode();

			 }
	};
}

XML.h

PHP:
#ifndef XML_H
#define XML_H

#include "stdafx.h"
#include <stdio.h>
#using <System.Xml.dll>
#using <mscorlib.dll>

using namespace std;
using namespace System::Xml;
using namespace System::Xml::Schema;

ref class XML {
private:
		


		int loadNode();

};
#endif

XML.cpp

PHP:
#include "stdafx.h"
#include <stdio.h>
#include <iostream>

#include "tinyxml2\tinyxml2.h"

#include "XML.h"


using namespace tinyxml2;
using namespace std;

int XML::loadNode(){

	
	XMLDocument doc;
	doc.LoadFile("XMLFile1.xml");

	XMLElement* root = doc.FirstChildElement();
	cout << "BLUBBB";

	cout << "BLAAAAAAAAAA: " << root->ToText();


	return 0;
}
Ergänzung ()

Ok hab durchs erklären den Fehler gefunden, Funktion war nicht public.

Weitere Frage: Warum werden meine "cout" Meldungen nicht angezeigt?
 
Die Methode loadNode() ist auch als private deklariert. Nach außen sichtbar ist sie erst, wenn Sie public deklariert ist. Daher kann die Forms-Klasse über das Callback nicht darauf zugreifen.
 
Dass deine cout << Meldungen nicht angezeigt werden, kann zwei Gründe haben. Zum einen schreibst du eine GUI-Applikation, sprich: eine Applikation mit einem Fenster, auf welche Kommandozeile soll dann eine cout << Ausgabe erfolgen? Zum zweiten schreibst du kein natives C++-Programm, sondern eine .NET-Anwendung, da solltest du für Ausgaben auf die .NET-Funktionen, in diesem Fall System::Console::WriteLine() zurückgreifen, siehe auch:

http://msdn.microsoft.com/de-de/lib...?cs-save-lang=1&cs-lang=csharp#code-snippet-4

Noch eine Anmerkung: du schreibst das gesamte Programm in C++/CLI, das ist nicht gerade sehr komfortabel. Empfehlenswerter wäre es, so viel Code wie möglich, insbesondere den die Form-GUI betreffenden, in C# zu verfassen (das ist für jemanden, der aus der C++-Ecke kommt, auch sehr leicht zu lernen), und den Teil, der auf die native XMLDocument-Klasse zurückgreift, als eigenständige Mixed-Mode-Assembly in C++/CLI zu erstellen. Selbst bei einem so einfach gehaltenen Programm wie deinem ist das die komfortablere Lösung.
 
Zurück
Oben