Avatar billede mikkeljans Nybegynder
30. marts 2004 - 23:35 Der er 19 kommentarer

C# Collection.Base i C++

Hvordan laver man en klasse som Collection.Base i C# til C++?

Så hvis jeg har en anden klasse (Klasse1) som nedarver fra Base (Klasse1 : Base)
Så man kan gøre Klasse1 til en Array der indeholder en liste af andre objecter, som ikke har en fast længde men længden men ændre sig eterhånden som man indsætter flere objecter til listen.
Avatar billede bertelbrander Novice
30. marts 2004 - 23:48 #1
Jeg kender ikke C#, men er det du ønsker et dynamisk 2d array af "et eller andet" ?
Avatar billede bertelbrander Novice
31. marts 2004 - 00:02 #2
Hvis du prøver at forklare lidt mere om hvad der er du ønsker er det muligt at vi kan finde en løsning.

Umidelbart vil jeg pege på std::list eller std::vector.
Avatar billede arne_v Ekspert
31. marts 2004 - 07:17 #3
managed C++ : brug Collection.Base

unmanaged C++ : brug en af de STL typer Bertel foreslår (fordi de er templated
                har du ikke brug for at lave din egen typesafe klasse udfra
                Collection.Base
Avatar billede mikkeljans Nybegynder
31. marts 2004 - 11:00 #4
Jeg har bare ikke fattet menningen med Iterators i STL..
F.eks med Insert i Vector..
Istedet for at lave en Iterator og finde placeringen..
Ville det så ikke være nemmere at bare lave en insert function der så sådan her ud:
Insert(int Placering, const TYPE &val)

Hvad er det smarte med Iterators?
Avatar billede bertelbrander Novice
31. marts 2004 - 20:10 #5
Man kan godt lave:
std::vector<int> Vec(124);
Vec[0] = 12;
Vec[123] = 34;
printf("%d %d\n", Vec[0], Vec[123]);
Man siger at en vector (til forskel fra f.ex. en list) tillader random access.

STL har tre komponenter:
-containers, f.ex. vector, list, map
-algoritmer, f.ex. sort, find,
-iterator som kan ses som et interface mellem containers og algoritmer, der gør at en algoritme kan bruges med alle typer 

Hvis man arbejder med en vector kan man bruge:

for(int i = 0; i < Vec.size(); i++)
  DoSomeThingWithAnInt(Vec[i]);

Men det kan man ikke med f.ex. en list, der kan man kun lave sekventiel acces med f.ex en iterator:

std::list<int> List;
std::list<int>::iterator i;
for(i = List.begin(); i != List.end(); i++)
  DoSomeThingWithAnInt(*i);

Denne metode vil virke med alle typer containers.
iteratorer gør også at man kan insert() elementer fra f.ex. en list i en vector.

Med en map kan man også bruge:

std::map<const char *, int> Map;
Map["OleBole"] = 1234;
Avatar billede mikkeljans Nybegynder
31. marts 2004 - 20:22 #6
Okay, Tak for hjælpen
Avatar billede arne_v Ekspert
31. marts 2004 - 21:23 #7
Måske vil du finde disse 2 eksempler illstrative:

C#:

using System;
using System.Collections;

public class MyData
{
    private string s;
    public MyData()
    {
        s = "";
    }
    public MyData(string s)
    {
        this.s = s;
    }
    public string S
    {
        get
        {
            return s;
        }
        set
        {
            s = value;
        }
    }
}

public class MyCollection : CollectionBase
{
    public MyData this[int index]
    {
      get
      {
        return (MyData)List[index];
      }
  }
  public int Add(MyData value)
  {
      return List.Add(value);
  }
}


class MainClass
{
    public static void Main(string[] args)
    {
        MyCollection mycol = new MyCollection();
        mycol.Add(new MyData("A"));
        mycol.Add(new MyData("BB"));
        mycol.Add(new MyData("CCC"));
        for(int i = 0; i < mycol.Count; i++)
        {
            Console.WriteLine(mycol[i].S);
        }
    }
}

C++:

#include <iostream>
#include <string>
#include <vector>

using namespace std;

class MyData
{
  private:
      string s;
  public:
      MyData() { s = ""; };
      MyData(string s) { this->s = s; };
      string GetS() { return s; };
      void SetS(string s) { this->s = s; };
};

int main()
{
  vector<MyData*> myvec;
  myvec.push_back(new MyData("A"));
  myvec.push_back(new MyData("BB"));
  myvec.push_back(new MyData("CCC"));
  for(int i = 0; i < myvec.size(); i++)
  {
      cout << myvec[i]->GetS() << endl;
  }
  return 0;
}
Avatar billede mikkeljans Nybegynder
31. marts 2004 - 23:22 #8
Hvorfor gør du i "vector<MyData*> myvec" MyData til en Pointer?
Jeg har aldrig rigtig forstået Pointers.. Hvorfor skal man pege på en hukommelse adresse?
Avatar billede arne_v Ekspert
31. marts 2004 - 23:24 #9
C++ new returnerer en pointer ...

Som hoved regel svarer alle referencer i C# (og Java) til pointere i C++.
Avatar billede arne_v Ekspert
31. marts 2004 - 23:26 #10
Hvis du prøver at kigger i .NET SDK docs vil du se at argumenterne i C++
versionen næsten altid er pointere.
Avatar billede mikkeljans Nybegynder
01. april 2004 - 11:42 #11
Hvornår skal jeg så bruge pointers og hvornår skal jeg ikk?
Avatar billede arne_v Ekspert
01. april 2004 - 12:04 #12
Det er et stort spørgsmål.

Hvis du vil have dine C++ programmer til at ligne dine C# programmer
så vil jeg anbefale at lade alt det du kender som reference typer
være pointere.
Avatar billede mikkeljans Nybegynder
02. april 2004 - 22:20 #13
Hvorfor virker det her ikke?

class Ints
{
private:
    vector<int*> List;
public:
    void Add(int Int)
    {
        List.push_back(new int());
        List[List.size()-1] = Int;
    }
};

"Cannot convert int to std::allocator"
Avatar billede arne_v Ekspert
02. april 2004 - 22:25 #14
Jeg tror at du mener:

class Ints
{
private:
    vector<int> List;
public:
    void Add(int Int)
    {
        List.push_back(Int);
    }
};
Avatar billede arne_v Ekspert
02. april 2004 - 22:25 #15
(men den kode forstår jeg nu heller ikke helt)
Avatar billede mikkeljans Nybegynder
02. april 2004 - 22:43 #16
Ja det virkede..
Men hvordan får jeg en [] operator ind i den?
Avatar billede arne_v Ekspert
02. april 2004 - 22:49 #17
Det må vel være noget a la:

int Ints::operator[](int ix)
{
  return List[ix];
}
Avatar billede arne_v Ekspert
12. april 2004 - 20:35 #18
OK ?
Avatar billede arne_v Ekspert
24. april 2004 - 18:16 #19
Tid at få afsluttet spørgsmålet ?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester