文字列をクラス ミューテーターに渡して、プライベート メンバーをその文字列に設定しようとしています。文字列を送信するコードは次のとおりです。
void parseTradePairs(Exchange::Currency *curr, std::string *response, int begin, int exit)
{
int start;
int end;
string temp;
string dataResponse;
CURL *tempCurl;
initializeCurl(tempCurl);
int location = response->find("marketid", begin);
if(location <= exit)
{
start = location + 11;
begin = response->find("label", start);
end = begin - start - 3;
findStrings(start, end, temp, response);
getMarketInfo(tempCurl, temp, dataResponse);
curr->_coin->setExch(temp); // here is the line of code that is sending the string
dataResponse >> *(curr->_coin);
curr->_next = new Exchange::Currency(curr, curr->_position + 1);
parseTradePairs(curr->_next, response, begin, exit);
}
}
これは、文字列を受け取って _exch に割り当てるコイン クラス内のミューテーターです。
void Coin::setExch(string exch)
{
_exch = exch;
}
私はそれを調べて、exchに文字列が含まれていることを確認しました。「105」ですが、ヒットするとすぐに _exch = exch; 読み取り違反が発生します。ポインタとしても渡してみました。範囲外にすべきではないと思います。クラスの文字列変数は、デフォルトのコンストラクターでゼロに初期化されますが、書き込みではなく読み取りを試みない限り、これは重要です。
/* defualt constructor */
Coin::Coin()
{
_id = "";
_label = "";
_code= "";
_name = "";
_marketCoin = "";
_volume = 0;
_last = 0;
_exch = "";
}
Exchange::Exchange(std::string str)
{
_exch = str;
_currencies = new Currency;
std::string pair;
std::string response;
CURL *curl;
initializeCurl(curl);
getTradePairs(curl, response);
int exit = response.find_last_of("marketid");
parseTradePairs(_currencies, &response, 0, exit);
}
int main(void)
{
CURL *curl;
string str;
string id;
Coin coin1;
initializeCurl(curl);
Exchange ex("cryptsy");
curl_easy_cleanup(curl);
system("pause");
return 0;
}
class Exchange
{
public:
typedef struct Currency
{
Currency(Coin *coin, Currency *next, Currency *prev, int position) : _coin(coin), _next(next), _prev(prev), _position(position) {}
Currency(Currency *prev, int position) : _prev(prev), _position(position), _next(NULL), _coin(&Coin()){}
Currency() : _next(NULL), _prev(NULL), _position(0) {}
Coin *_coin;
Currency *_next;
Currency *_prev;
int _position;
};
/* constructor and destructor */
Exchange();
Exchange(std::string str);
~Exchange();
/* Assignment operator */
Exchange& operator =(const Exchange& copyExchange);
/* Parse Cryptsy Pairs */
friend void parseTradePairs(Currency *curr, std::string *response, int begin, int exit);
private:
std::string _exch;
Currency *_currencies;
};
ここに私がそれを修正するために変更したものがあります。typedef 構造体通貨
{
Currency(Coin *coin, Currency *next, Currency *prev, int position) : _coin(coin), _next(next), _prev(prev), _position(position) {}
Currency(Currency *prev, int position) : _prev(prev), _position(position), _next(NULL), _coin(&Coin()){}
Currency()
{
_next = NULL;
_prev = NULL;
_position = 0;
_coin = new Coin();
}
Coin *_coin;
Currency *_next;
Currency *_prev;
int _position;
};