Bir otomatik silme mekanizması ile redo geri

oy
0

Benim uygulama Qt kullanarak C ++ gelişmiştir ve sinyalleri ve yuvaları kullanıyor.

en aşağıdaki sınıfları (sözde C ++ kodu) var diyelim:

class Ball
{
    Color m_Color;
    int m_Size;
};

class Player
{
public:
    setBall(Ball* pBall)
    {
        if (pBall != m_pBall)
        {
            Ball* pPreviousBall = m_pBall;
            m_pBall = pBall;
            emit notifyBallNotUsed(pPreviousBall);
        }
    }

    Ball* getBall();

signals:
    void notifyBallNotUsed(Ball*);

private:
    String m_Name;
    Ball* m_pBall;
};

class GeneralHandler
{
public:
    addBall(Ball* pBall);
    deleteBall(Ball* pBall);


    addPlayer(Player* pPlayer)
    {
        connect(pPlayer, SIGNAL(notifyBallNotUsed(Ball*)), this, SLOT(onBallUsageChanged(Ball*)));
        ...
    }
    deletePlayer(Player* pPlayer);
    {
        disconnect(pPlayer, SIGNAL(notifyBallNotUsed(Ball*)), this, SLOT(onBallUsageChanged(Ball*)));

        onBallUsageChanged(pPlayer->getBall());
        ....
    }

private slots:
    void onBallUsageChanged(Ball* pBall)
    {
        if (isNotUsedAnymore(pBall))
        {
            m_BallList.remove(pBall);
            delete pBall;
        }
    }

private:
    bool isNotUsedAnymore(Ball* pBall); // Check if the given ball is still used by at least one player

    List<Player*> m_PlayerList;
    List<Ball*> m_BallList;
};

Benim uygulama ile, kullanıcı ekleme / oyuncu kaldırmak ve her oyuncu için, renk ve topun boyutunu karar verebilir. Kaputun arkasında, GeneralHandler topları saklamak ve bunları silmek için sorumludur. Iki oyuncu aynı topu kullandığınızı pekala mümkündür.

Bir oyuncu silindiğinde top artık kullanılmadığı takdirde, GeneralHandler silmeliler (veya top yine başka bir oyuncu tarafından kullanılması halinde tutmak). Bir oyuncu kullandığı top değiştirilirse artık kullanılmadığı takdirde, bir önceki top, yanı GeneralHandler tarafından silinmelidir.

Çok uzak çok iyi.

Şimdi, komut kalıbı kullanarak benim uygulamaya geri alma / yineleme özelliği eklemek istiyorum, ve şaşırıp budur. Böyle bir şey var Sağlar ki:

class ChangePlayerBall : public QUndoCommand
{
public:
    ChangePlayerBall(Player* pPlayer, Ball* pNewBall)
    {
        m_pPlayer = pPlayer;
    }

    void redo();
    void undo();

private:
    Player* m_pPlayer;
};

Ben yinele () metodu aşağıdaki gibi görünecektir tahmin:

void ChangePlayerBall::redo()
{
    m_pPlayer->setBall(pNewBall);
}

başka bir şey yukarıdaki kodda değiştirilirse diğer oyuncular tarafından artık kullanılmaması halinde önceki Topu silinecektir. geri alma () yöntemini uygularken bu bir sorun olacak: Önceki top silinmişse, bunun karakteristikleri var ve geri alma komutu yeniden oluşturmanız mümkün olmayacaktır neydi bilmiyorum. Veya belki de bir önceki topu saklamak gerekir, ancak bu önceki top hala mevcut veya işleyicisi tarafından silinmiştir ise geri alma / yineleme komutu nasıl bilecek? Ya da belki en kısa sürede geri al komutu uygulanmalıdır artık kullanılmaz olarak bir topu silinmesinin bu mekanizma? Sorun geri alma komutu birçok diğer sınıfların üzerinde bağımlılıkları çok şey var olacaktır. Başka bir sorun bu kod kısmen benzer bir şey yapmak zorunda kalacaktır DeletePlayer komutu, içinde çoğaltılabilir olduğunu ifade etti:

class DeletePlayer : public QUndoCommand
{
public:
    DeletePlayer(Player* pPlayer);

    void redo();
    void undo();
...
};

Nerede anlaşılabilir benim explainations umut!

Nasıl bu sorunu çözecek? Ben tatmin edici bir çözüm bulamıyor.

Teşekkürler !

Oluştur 09/12/2008 saat 14:50
kaynak kullanıcı
Diğer dillerde...                            


3 cevaplar

oy
1

diğer oyuncular tarafından artık kullanılmadığı takdirde Topu silinecek

I görebileceğiniz gibi - bu s the source of your doubts. Certainly undo() command shouldn't recreate an object nor have itkendi silme mekanizması bu. Senin GeneralHandler.isNotUsedAnymore () nasıl çalışır? Topların başvurular sayarsa, ChangePlayerBall örneğine değini daha da sayılacaktır olmalıdır. Nedenle bazı GeneralHandler`s yuvaları için Komut nesnesi bağlamak için gerekli olacaktır.

Yani, öneririm:

  1. O `herhangi oyuncular tarafından kullanılmayan zaman Topu silinir ve (renk değişikliği ve vb dahil olabilir) herhangi UndoCommands
  2. `ve bitmiş gibi yeni top atamasında top ve oyuncu frenler arasındaki Bağlantı
  3. (Tamamen istiften) command`s nesne yıkıcı top ve komut frenleri arasında Bağlantı

Umarım yardımcı olur )

Cevap 16/12/2008 saat 10:08
kaynak kullanıcı

oy
0

Nasıl top için bir referans sayma hile kullanmaya ne dersiniz? Bir top komutu saklanır, komut dolayısıyla (eğer uygulama nasıl değiştireceği bağlı kendisini ya göre) işleyicisi tarafından silinmesini engelleyen, topu başvuru sayısı artırır olabilir.

Cevap 28/05/2009 saat 21:26
kaynak kullanıcı

oy
0
  1. komutası yapıcı topu kaydedin.
  2. gerektiğinde giriş / çıkış koyun.
  3. bellek sızıntılarını önlemek için her yerde topu QSharedPointer kullanın.
Cevap 01/12/2010 saat 09:12
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more