Привет, я пытаюсь создать новую структуру внутри моего класса, но я думаю, что есть проблема с общественным и частным масштабом.
typedef struct Currency
{
Currency(Coin *coin, Currency *next, int _position) : _coin(coin), _next(next), _position(0) {}
Currency() : _next(NULL), _position(0) {}
Coin *_coin;
Currency *_next;
int _position;
};
это моя структура, которая находится внутри моего публичного раздела моего класса, и когда я пытаюсь это сделать
if(location <= exit)
{
start = location + 11;
begin = response.find("label", start);
end = begin - start - 3;
findStrings(start, end, s, &response);
curr._next = new Currency();
}
он говорит о предполагаемом спецификаторе типа для нового вызова Currency(). есть ли что-то, чего я не вижу или не должны использоваться такие структуры?
class Exchange {public:
typedef struct Badge
{
Badge(std::string id, Badge next, Badge prev, int length) : _id(id), _next(&next), _prev(&prev), _position(length) {}
Badge() : _id(""), _next(NULL), _prev(NULL), _position(0) {}
std::string _id;
Badge *_next;
Badge *_prev;
int _position;
};
typedef struct Currency
{
Currency(Coin *coin, Currency *next, int _position) : _coin(coin), _next(next), _position(0) {}
Currency() : _next(NULL), _position(0) {}
Coin *_coin;
Currency *_next;
int _position;
};
/* constructor and destructor */
Exchange();
Exchange(std::string str);
~Exchange();
/* Assignment operator */
Exchange& operator =(const Exchange& copyExchange);
void parseTradePairs(Currency curr, const std::string response, int begin, int exit);
private:
std::string _exch;
Currency *_currencies;
Badge *_ident;
typedef struct Badge
{
Badge(std::string id, Badge next, Badge prev, int length) : _id(id), _next(&next), _prev(&prev), _position(length) {}
Badge() : _id(""), _next(NULL), _prev(NULL), _position(0) {}
std::string _id;
Badge *_next;
Badge *_prev;
int _position;
};
typedef struct Currency
{
Currency(Coin *coin, Currency *next, int _position) : _coin(coin), _next(next), _position(0) {}
Currency() : _next(NULL), _position(0) {}
Coin *_coin;
Currency *_next;
int _position;
};
/* constructor and destructor */
Exchange();
Exchange(std::string str);
~Exchange();
/* Assignment operator */
Exchange& operator =(const Exchange& copyExchange);
void parseTradePairs(Currency curr, const std::string response, int begin, int exit);
private:
std::string _exch;
Currency *_currencies;
Badge *_ident;
}; };
^, который находится в заголовке класса
Exchange::Exchange()
{
_exch = "";
}
Exchange::Exchange(std::string str)
{
_exch = str;
_ident = new Badge;
_currencies = new Currency;
std::string pair;
std::string response;
CURL *curl;
getTradePairs(curl, response);
int exit = response.find_last_of("marketid");
parseTradePairs(*_currencies, response, 0, exit);
}
void parseTradePairs(Exchange::Currency curr, std::string response, int begin, int exit)
{
int start;
int end;
string s;
int location = response.find("marketid", begin);
if(location <= exit)
{
start = location + 11;
begin = response.find("label", start);
end = begin - start - 3;
findStrings(start, end, s, &response);
curr._next = new Currency();
}
}
^, что, очевидно, в классе cpp.
Определение вашей функции в.cpp не связано с классом Exchange
. Вам нужно будет написать:
void Exchange::parseTradePairs
(Exchange::Currency curr, std::string response, int begin, int exit)
{
// ...
}
Кроме того: в любом месте за пределами вашего класса вам необходимо использовать Exchange::Currency
для доступа к типу.
Если вы создаете Currency
в рамках метода класса, это должно работать нормально. Но если вы создаете Currency
другом месте, вам нужно развернуть ее с именем класса.
Т.е. ClassName::Currency
Конечно, Currency
должна быть видимой в том объеме, в котором вы это делаете, и public
следует позаботиться об этом.
(Примечание: это не ответ на редактируемый вопрос, downvote для запроса удаления... :-)
Одна из проблем заключается в следующем:
typedef struct Currency {
};
Он компилируется, но компилятор C++ должен сказать что-то вроде warning: 'typedef' was ignored in this declaration
(а если нет, включите предупреждение!). Вы должны использовать один из них:
struct Currency {
}; // type 'struct Currency' With implicit typedef in C++
который в C++ по существу такой же, как:
typedef struct Currency {
} Currency; // explicit typedef
или
typedef struct {
} Currency; // anonumous struct With typedef type name
Как правило, лучше всего использовать первую форму в C++. Там могут быть тонкие различия в некоторых случаях, так что держите вещи простыми.
C не выполняет неявный typedef, поэтому иногда используется вторая или третья форма, чтобы избежать необходимости использовать ключевое слово struct везде. Это хорошо знать, потому что многие библиотеки имеют одинаковые файлы.h для C и C++.