Gå til innhold

Managed c++, får ikke tilgang til metoder fra C# prosjekt.


Anbefalte innlegg

Har en skoleoppgave hvor man skal lage et prosjekt med managed c++ og bruke det i en C# applikasjon.

Leksjonen som er alt jeg har å støtte meg til er veldig uklar og jeg sliter litt med å få til c++ delen.

Om noen kunne sett på koden og gitt en pekepin på hva som kan være galt hadde vært fint.

Problemet er at jeg ikke får tilgang til metodene etter at jeg har laget et objekt av f.eks Rectangle.

Det er godt mulig jeg har tullet stort med c++ klassene, men håper på at noen kan gi meg et hint om hva

som kan ha vært annerledes.

// Figure.h
#pragma once
using namespace System;
namespace GEOFigure {
class Figure
{
	public:
		virtual double omkrets()=0;
		virtual double areal()=0;
};
public class Rectangle : public Figure
{
	public:
		//Rectangle();
		Rectangle(double height,double width);
		~Rectangle();
		virtual double omkrets();
		virtual double areal();
	private:
		double m_height;
		double m_width;
};
public class Triangle : public Figure
{
	public:
		Triangle();
		Triangle(double s1,double s2,double s3);
		~Triangle();
		 double omkrets();
		virtual double areal();
	private:
		double m_s1;
		double m_s2;
		double m_s3;
};
public class Circle : public Figure
{
	public:
		Circle();
		Circle(double radius);
		~Circle();
		virtual double omkrets();
		virtual double areal();
	private:
		double m_radius;
};
}

 

#include "stdafx.h"
#include "Figure.h"
using namespace GEOFigure;
Rectangle::Rectangle(double height,double width){
m_height = height;
m_width = width;
}

double Rectangle::omkrets(void){
return (m_height *2) + (m_width*2);
}

double Rectangle::areal(void){
return m_height * m_width;
}

Triangle::Triangle(double s1,double s2,double s3){
m_s1 = s1;
m_s2 = s2;
m_s3 = s3;
}

double Triangle::omkrets(void){
return m_s1 + m_s2 + m_s3;
}

double Triangle::areal(void){	
double height = Math::Pow(m_s1,2) - Math::Pow(m_s2,2);
height = Math::Sqrt(height);
double areal = (height * m_s3) / 2;
return areal;
}

Circle::Circle(double radius){
m_radius = radius;
}

double Circle::omkrets(void){
return m_radius *2 * Math::PI;
}

double Circle::areal(void){
return m_radius * m_radius * Math::PI;
}

Lenke til kommentar
Videoannonse
Annonse
Først og fremst må du vel lage en .NET klasse

public __gc class GEOFigure

 

Jeg husker jeg trøblet med dette første gang jeg drev med dette også; løsningen er ganske enkel, men jeg husker ikke helt hva det var...

 

public __gc class Shape

Gir følgende feilmelding:

Error 1 error C4980: '__gc' : use of this keyword requires /clr:oldSyntax command line option d:\docs\c\ln348d\oving8\shape\Shapes.h 8 Shapes

 

Jeg vil tro at det er en noen endringer i keywords i VS 2008 (som er den versjonen av VS vi bruker)

Det går selvsagt å bruke '/clr:oldSyntax', men dette frister egentlig ikke. Jaffall ikke før det evt virkelig begynner å haste med å få øvingen levert. Vet noen om en tutorial for managed c++ som er oppdatert til VS2008? De jeg finner rundt omkring ser ikke ut til å være oppdatert.

Lenke til kommentar

Da har man kommet _litt_ lenger..

 

Denne koden kompilerer fint og løser oppgaven, men ikke ihht ønsket måte:

 

Om man ser på de linjene som er kommentert ut i Shape:GeoShape ser man hvordan jeg har prøvd å få til en virtuell superklasse, som er et av poengene med øvingen, men det gir en hel bunke med feilmeldinger som i store trekk går på at ting ikke er implementert riktig.

 

Det er sikkert en fillefeil i koden min, men jeg finner den i såfall ikke.

 

Shape.h

// Shape.h

#pragma once

using namespace System;
namespace Shape {
   //public ref class GeoShape abstract{
   public ref class GeoShape {
   public:
       //virtual double area(void)=0;
       //virtual double circumference(void)=0;
   };


   public ref class Circle :public GeoShape{
   private:
       double radius;

   public:
       Circle (){
           this->radius = 1.0;
       }

       void SetRadius(double radius){
           this->radius = radius;
       }

       double Area(void){
           return Math::PI * radius * radius;
       }

       double Circumference(void){
           return Math::PI*2.0*radius;
       }
   };

   public ref class Rectangle :public GeoShape{
   private:
       double heigth;
       double width;

   public:
       Rectangle (){
           this->heigth = 1.0;
           this->width = 1.0;
       }        

       void SetHeigth(double heigth){
           this->heigth = heigth;
       }

       void SetWidth(double width){
           this->width = width;
       }

       double Area(void){
           return width * heigth;
       }

       double Circumference(void){
           return 2.0 * width + 2.0 * heigth;
       }
   };

   public ref class Triangle :public GeoShape{
   private:
       double sideA;
       double sideB;
       double sideC;

   public:
       Triangle (){
           this->sideA = 1.0;
           this->sideB = 1.0;
           this->sideC = 1.0;
       }        

       void SetSideA(double sideA){
           this->sideA = sideA;
       }

       void SetSideB(double sideB){
           this->sideB = sideB;
       }

       void SetSideC(double sideC){
           this->sideC = sideC;
       }

       double Area(void){
           double sp = 0.5 *(sideA + sideB + sideC);
           return Math::Sqrt(sp *(sp - sideA) * (sp - sideB) * (sp - sideC));
       }

       double Circumference(void){
           return sideA + sideB + sideC;
       }
   };
}

 

Shape.cpp

// This is the main DLL file.

#include "stdafx.h"
#include "Shape.h"

 

FrmMain.cs

komponenter i vinduet: tre tekstbokser for figur-parametre, en nedtrekksboks for valg av figur og labler for resultat

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Shape;

namespace oving8 {

   public partial class FrmMain : Form {

       // Skulle gjerne ha gjort noe sånt
       /*
       Shape.GeoShape[] shapes = {
           new Shape.Circle (), 
           new Shape.Rectangle (),
           new Shape.Triangle ()
       };
       */

       // Omgår her hele problemet ved å ikke bruke arv i det hele tatt
       Shape.Circle c = new Shape.Circle ();
       Shape.Rectangle r = new Shape.Rectangle ();
       Shape.Triangle t = new Shape.Triangle ();

       public FrmMain () {
           InitializeComponent ();
       }

       private void txtRadius_TextChanged (object sender, EventArgs e) {
           //Double.TryParse (txtRadius.Text, out r);
           //double a = s.area ();
           //lblArea.Text = ""+a;
       }

       private void FrmMain_Load (object sender, EventArgs e) {
           cboShape.SelectedIndex = 0;
       }

       private void cboShape_SelectedIndexChanged (object sender, EventArgs e) {
           switch (cboShape.SelectedIndex){
               // Ja, dette kunne ha vært gjort mye mer elegent..
               case 0: // Sirkel
                   lblArg1.Text = "Radius";
                   txtArg1.Enabled = true;
                   txtArg1.Text = "1.0";
                   lblArg2.Text = "N/A";
                   txtArg2.Enabled = false;
                   txtArg2.Text = "";
                   lblArg3.Text = "N/A";
                   txtArg3.Enabled = false;
                   txtArg3.Text = "";
                   break;
               case 1: // Rektangel
                   lblArg1.Text = "Høyde";
                   txtArg1.Enabled = true;
                   txtArg1.Text = "1.0";
                   lblArg2.Text = "Bredde";
                   txtArg2.Enabled = true;
                   txtArg2.Text = "1.0";
                   lblArg3.Text = "N/A";
                   txtArg3.Enabled = false;
                   txtArg3.Text = "";
                   break;
               case 2: // Triangel
                   lblArg1.Text = "Side A";
                   txtArg1.Enabled = true;
                   txtArg1.Text = "1.0";
                   lblArg2.Text = "Side B";
                   txtArg2.Enabled = true;
                   txtArg2.Text = "1.0";
                   lblArg3.Text = "Side C";
                   txtArg3.Enabled = true;
                   txtArg3.Text = "1.0";
                   break;
           }
       }

       private void txtArg_TextChanged (object sender, EventArgs e) {
           TextBox tb = (TextBox) sender;
           tb.Text = tb.Text.Replace ('.', ',');
           tb.SelectionStart = tb.Text.Length;
           string str = tb.Text;
           string strTmp = "";
           foreach (char c in str) {
               if (char.IsDigit ©||c==',') {
                   strTmp += c;
               }
           }
           tb.Text = strTmp;
           calcShape ();
       }

       private void calcShape () {
           double value;
           string form = "#0.00";
           switch (cboShape.SelectedIndex) {
               case 0:
                   if (Double.TryParse (txtArg1.Text, out value)) c.SetRadius (value);

                   lblArea.Text = c.Area ().ToString (form);
                   lblcircumference.Text = c.Circumference ().ToString (form);
                   break;
               case 1:
                   if (Double.TryParse (txtArg1.Text, out value)) r.SetHeigth (value);
                   if (Double.TryParse (txtArg2.Text, out value)) r.SetWidth (value);

                   lblArea.Text = r.Area ().ToString (form);
                   lblcircumference.Text = r.Circumference ().ToString (form);
                   break;
               case 2:
                   if (Double.TryParse (txtArg1.Text, out value)) t.SetSideA (value);
                   if (Double.TryParse (txtArg2.Text, out value)) t.SetSideB (value);
                   if (Double.TryParse (txtArg3.Text, out value)) t.SetSideC (value);

                   lblArea.Text = t.Area ().ToString (form);
                   lblcircumference.Text = t.Circumference ().ToString (form);
                   break;
           }
       }
   }
}

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...