Вложенные структуры, интерфейсы и классы в интерфейсе - PullRequest
0 голосов
/ 22 мая 2011

Я на самом деле переводю некоторый код C ++ (о котором я очень мало знаю и никогда не использовал) в C #.Обычно в C # я бы не обнаружил, что делаю что-то подобное, поскольку это кажется немного странным, но с учетом того, как настроен код на C ++, мне трудно не делать это таким образом.По общему признанию, я не очень опытен в программировании вообще, но за то время, которое я занимался этим, я смог понять концепции довольно хорошо.

В любом случае, вот код C ++.Это тоже в заголовочном файле.

#ifndef _SPRITE_H_
#define _SPRITE_H_

#ifdef __cplusplus
    extern "C" {
#endif /* __cplusplus */


#ifndef NULL
    #define NULL ((void *) 0)
#endif

typedef struct {
    unsigned char *data;
    int len;
    int width;
    int height;
} SpriteImage;


typedef struct {
    unsigned char b;
    unsigned char g;
    unsigned char r;
    unsigned char unused;
} SpritePalette;


typedef struct {
    char *filename;
    unsigned int nimages;
    SpriteImage *images;
    unsigned int palette_size;
    SpritePalette *palette;
} Sprite;


typedef enum {
    /* Developer errors */
    SE_BADARGS,

    /* sprite_new() errors */
    SE_CANTOPEN,
    SE_INVALID,

    /* sprite_to_bmp(), sprite_to_bmp_file() and sprite_to_rgb() errors */
    SE_INDEX,

    /* sprite_to_bmp_file() errors */
    SE_CANTWRITE
} SpriteError;

//Funcion para hacer uso de reverse_palette desde el exterior
SpritePalette * get_pal(SpritePalette *palette,int palette_len);

/* Open sprite file */
Sprite *sprite_open (const char *fname, SpriteError *error);

Sprite *sprite_open_from_data (const unsigned char *data, unsigned int size, SpriteError *error);

/* Change palette of sprite*/
void change_palete(Sprite *sprite, const char *fname, SpriteError *error);

/* Converts a sprite to bitmap file in memory */
void *sprite_to_bmp (Sprite *sprite, int i, int *size, SpriteError *error);

/* Like sprite_to_bmp(), but saves the result to a file */
int sprite_to_bmp_file (Sprite *sprite, int i, const char *writeToFile, SpriteError *error);

/* Converts a sprite to raw RGB data. The rowstride/pitch is 3*width. */
void *sprite_to_rgb (Sprite *sprite, int i, int *size, SpriteError *error);

/* Frees a Sprite* pointer */
void sprite_free (Sprite *sprite);


#ifdef __cplusplus
    }
#endif /* __cplusplus */

#endif /* _SPRITE_H_ */

Кстати, кто-нибудь знает, что это за сделка со ссылкой '#'?

Я понятия не имею, к чему они относятся.

А вот C #:

interface Sprite
 {
    public class SpriteImage
    {
        private byte *data;
        private int length;
        private int width;
        private int height;
    }

    public class SpritePalette
    {
        byte b;
        byte g;
        byte r;
        byte unused;
    }

    public class Sprite
    {
        string fileName;
        uint nImages;
        uint palette_size;
        SpriteImage image;
        SpritePalette palette; 
    }

    public enum SpriteErrors
    { 
        None, //--default value
        BadArguments, //--dev errors

        /*--errors derived from any instance/call of the NewSprite() method */
        CantOpen, 
        Invalid,

        /*SpriteToBMP(), SpriteToBMPFile(), and SpriteToRGB() errors*/
        Index,

        CantWrite //--SpriteToBMPFile() errors 
    }

    public interface ISprite
    {
        SpritePalette GetPalette(SpritePalette palette, int paletteLength);

        Sprite SpriteOpen(string firstName, SpriteErrors* error);

        Sprite SpriteOpenFromData(byte* data, uint size, SpriteErrors* error);


    } 

Я уверен, что вы можете соединить точки здесь.Имейте в виду, что это не мой код, очевидно, поэтому я не очень много знаю об этом.Если кому-то понадобятся какие-то материалы, я с радостью их предоставлю

Ответы [ 2 ]

1 голос
/ 22 мая 2011

пара баллов:1) там ваши типы не должны быть внутри интерфейса2) указатели должны быть либо преобразованы в члены, как у вас в классе sprite, либо в массивы, как вы должны иметь в структуре SpriteImage3) если это не тривиальный порт, его будет очень сложно писать без хорошего понимания обоих языков и кода для переноса

0 голосов
/ 22 мая 2011

Вы, кажется, пытаетесь портировать этот проект SourceForge с C ++ на C #:

Этот просмотрщик написан не только на C ++, но и основан на Qt Toolkit .

Я знаю, что ваш вопрос касается перевода этого конкретного заголовочного файла с C ++ на C # и каков наилучший подход, но я считаю, что если вы не очень хорошо разбираетесь в C ++ и не хотите много узнать о Qt, ваши шансы успеха в этом проекте портирования не очень хорошо. Это большой проект даже для программиста, который работает на C ++ и C #.

Однако, если вы все еще хотите сделать это, то подход, который вы должны использовать, - это создать один большой SpriteUtility статический класс и поместить все свободные функции C ++, которые вы найдете в этот класс, как static C # методы. , Да, вы также можете поместить структуры C ++, которые вы видите, как вложенные классы. Вам не нужны никакие интерфейсы.

Это не должен быть красивый код C #; вы пытаетесь портировать его дословно, нанося ему как можно меньше урона. Как только он заработает, вы можете изменить его, чтобы сделать его более объектно-ориентированным в традиционном стиле C #.

...