0

CConfig という名前のクラスがあり、新しいオブジェクトを作成しています:

std::vector< CConfig > docs;

CConfig newfile( "somefile.xml", "root" );
printf("%s", newfile.GetTagValue( "servername" )); // this works
docs.push_back( newfile );

.at メソッドでこのオブジェクトを取得しているとき

CConfig file = docs.at(0);
printf("%s", file.GetTagValue( "servername" )); // this crashes

問題はどこですか?

(フォーマットが間違っていたら申し訳ありませんが、帯域幅が終了し、最大速度が 1kb/s であるため、現在は JavaScript を使用していません。後で修正します)

CConfig.h:

class CConfig
{
    TiXmlDocument       m_doc;
    TiXmlElement*       m_pRoot;
    bool                m_bIsLoaded;

public:
                    CConfig                     ( void ) {};
                    CConfig                     ( const char * pszFileName, const char * pszRootName );
                    ~CConfig                    ( void ) {};

const char*         GetTagValue                 ( const char * pszTagName );
const char*         GetTagAttribute             ( const char * pszTagName, const char * pszAttributeName );
TiXmlElement*       GetRootElement              ( void )    { return m_pRoot; };
bool                IsAvailable                 ( void )    { return m_bIsLoaded; };
};

CConfig.cpp

#include "CConfig.h"

CConfig::CConfig( const char * pszFileName, const char * pszRootName )
{
    m_bIsLoaded = m_doc.LoadFile( pszFileName );
    if( m_bIsLoaded )
        m_pRoot = m_doc.FirstChildElement( pszRootName );
}

const char * CConfig::GetTagValue( const char * pszTagName )
{
    if( m_bIsLoaded && m_pRoot )
    {
        TiXmlElement * element = m_pRoot->FirstChildElement( pszTagName );
        if( element )
            return element->GetText();
    }
}

const char * CConfig::GetTagAttribute( const char * pszTagName, const char * pszAttributeName )
{
    if( m_bIsLoaded && m_pRoot )
    {
        TiXmlElement * element = m_pRoot->FirstChildElement( pszTagName );
        if( element )
            return element->Attribute( pszAttributeName );
    }
}

私はtinyxmlを使用しています

4

2 に答える 2

2

コピー スペースが問題にならない場合は、コピー コンストラクターを適切に追加して、3 つのルール違反を修正します。

CConfig(const CConfig& obj) 
   : m_doc(obj.m_doc)
   , m_bLoaded(obj.m_bLoaded)
   , m_pRoot()
{
   if (m_bLoaded)
      m_pRoot = m_doc.GetRootElement();
}

代入演算子も適切である可能性がありますが、必要ない場合は、C++ 11 属性機能として宣言する (ただし実装しない) ことによって非表示にするprivateか、C++11delete属性機能を使用します。

興味深いことに、m_bLoadedメンバーさえ必要ありません。NULL 以外のルート ポインターは、ロードされた状態を示すことができますが、それは別の問題です。少なくとも、これで十分です。

于 2013-08-10T21:21:00.453 に答える