Uncertainty about using CCSprite Objects...

So my port from iOS to Android is moving along, but I have some real uncertainty about how I’m making my CCSprite objects in C++. For whatever reason, I can’t seem to add them as a child to the scene.

Domino.h

/*
 * Domino.h
 */

#ifndef DOMINO_H_
#define DOMINO_H_

using namespace std;

#include 
#include "cocos2d.h"

class Domino : public cocos2d::CCSprite
{
public:
    //Default Contructor
    Domino();

    //Overload Contructor
    Domino(std::string, std::string, int, int, int, int, int, int, int, int);

    //Deconstructor Contructor
    ~Domino();

    //Accessor Constructor
    string getstr_tilename() ;
    string getstr_mirrortilename() ;
    int getint_leading();
    int getint_trailing();
    int getint_suitrank() ;
    int getint_trickvalue() ;
    int getint_playerid() ;
    int getint_matchtile() ;
    int getint_bidvalue() ;
    int getint_markvalue() ;

    //Mutator Function
    void setstr_tilename(string) ;
    void setstr_mirrortilename(string) ;

    void setint_leading(int);
    void setint_trailing(int);
    void setint_suitrank(int) ;
    void setint_trickvalue(int) ;
    void setint_playerid(int) ;
    void setint_matchtile(int) ;
    void setint_bidvalue(int) ;
    void setint_markvalue(int) ;

private:
    std::string _str_tilename;
    std::string _str_mirrortilename;

    int _int_leading;
    int _int_trailing;
    int _int_suitrank;
    int _int_trickvalue;
    int _int_playerid;
    int _int_matchtile;
    int _int_bidvalue;
    int _int_markvalue;

};


#endif /* DOMINO_H_ */

Domino.cpp

/*
 * Domino.cpp
 *
 */
#include "Domino.h"

Domino::Domino()
{

    _str_tilename="";
    _str_mirrortilename="";

    _int_leading=0;
    _int_trailing=0;
    _int_suitrank=0;
    _int_trickvalue=0;
    _int_playerid=0;
    _int_matchtile=0;
    _int_bidvalue=0;
    _int_markvalue=0;
}


Domino::Domino(string str_tilename,  string str_mirrortilename,  int int_leading, int int_trailing, int int_suitrank, int int_trickvalue, int int_playerid, int int_matchtile, int int_bidvalue, int int_markvalue)
{

    _str_tilename=str_tilename;
    _str_mirrortilename=str_mirrortilename;

    _int_leading=int_leading;
    _int_trailing=int_trailing;
    _int_suitrank=int_suitrank;
    _int_trickvalue=int_trickvalue;
    _int_playerid=int_playerid;
    _int_matchtile=int_matchtile;
    _int_bidvalue=int_bidvalue;
    _int_markvalue=int_markvalue;


}

Domino::~Domino()
{


}

//===============================Getters======================================
string Domino::getstr_tilename()
{
    return _str_tilename;

}

string Domino::getstr_mirrortilename()
{
    return _str_mirrortilename;

}

int Domino::getint_leading()
{
    return _int_leading;

}

int Domino::getint_trailing()
{
    return _int_trailing;

}

int Domino::getint_suitrank()
{
    return _int_suitrank;

}


int Domino::getint_trickvalue()
{
    return _int_trickvalue;

}

int Domino::getint_playerid()
{
    return _int_playerid;

}

int Domino::getint_matchtile()
{
    return _int_matchtile;

}

int Domino::getint_bidvalue()
{
    return _int_bidvalue;

}

int Domino::getint_markvalue()
{
    return _int_markvalue;

}

//===============================Setters======================================

void Domino::setstr_tilename(string str_tilename)
{
    _str_tilename=str_tilename;

}

void Domino::setstr_mirrortilename(string str_mirrortilename)
{
    _str_mirrortilename=str_mirrortilename;

}

void Domino::setint_leading(int int_leading)
{
   _int_leading=int_leading;

}

void Domino::setint_trailing(int int_trailing)
{
    _int_trailing=int_trailing;

}

void Domino::setint_suitrank(int int_suitrank)
{
    _int_suitrank=int_suitrank;

}


void Domino::setint_trickvalue(int int_trickvalue)
{
    _int_trickvalue=int_trickvalue;

}

void Domino::setint_playerid(int int_playerid)
{
    _int_playerid=int_playerid;

}

void Domino::setint_matchtile(int int_matchtile)
{
    _int_matchtile=int_matchtile;

}

void Domino::setint_bidvalue(int int_bidvalue)
{
    _int_bidvalue=int_bidvalue;

}

void Domino::setint_markvalue(int int_markvalue)
{
    _int_markvalue=int_markvalue;

}

GameScene

    CCSpriteBatchNode *spritesBgNode;
    spritesBgNode = CCSpriteBatchNode::create("stack.png", kCCTexture2DPixelFormat_RGBA4444);
    CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("stack.plist");
    this->addChild(spritesBgNode, 0);


    Domino d00; //In Objective C, it was defined as a pointer.  Am I doing this correctly here?
    d00.createWithSpriteFrameName("blank.png");
    d00.setstr_tilename("0-0.png");
    d00.setstr_mirrortilename("0-0.png");
    d00.setint_leading(0);
    d00.setint_trailing(0);
    d00.setint_bidvalue(3);
    d00.setint_matchtile(0);

    d00.retain();
    this->addChild(&d00, 2);

What I end up getting is an assertion failure: “CCAssert(m_uReference > 0,”reference count should greater than 0“);” Where I assume this object is attempting to release an object that’s already released. Why would it be doing this even though I set it to retain? The program does not crash if I don’t try to add it as a child, but that sort of defeats the purpose. What am I doing wrong?

Peter Wiggin wrote:

Domino d00; //In Objective C, it was defined as a pointer. Am I doing this correctly here?

This is a local object not a pointer in C++. You declare pointers like this:
Domino* d00;

Notice that you did it the same way here: CCSpriteBatchNode spritesBgNode;
Also you should not use createWithSpriteFrameName method if you want to create an object which type is Domino because this method creates a CCSprite object. However you can override createWithSpriteFrameName in your domino class in such way that it would create a Domino object and not CCSprite. Simple solution that should work without overriding createWithSpriteFrameName could look like this:
Domino
d00 = new Domino();
d00~~>initWithSpriteFrameName;
d00~~>autorelease();
d00~~>setstr_tilename;
d00~~>setstr_mirrortilename(“0-0.png”);

Note that this is wrong:
Domino* d00 = Domino::createWithSpriteFrameName(“blank.png”); // wrong, createWithSpriteFrameName will create CCSprite and you don’t want that
d00->setstr_tilename(“0-0.png”);

Great! That’s a lot more in line with how I did it in Objective-C.