Создайте новую структуру внутри публичного метода класса

0

Привет, я пытаюсь создать новую структуру внутри моего класса, но я думаю, что есть проблема с общественным и частным масштабом.

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;

}; };

ENDIF

^, который находится в заголовке класса

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.

  • 0
    Не могли бы вы показать это в контексте объявления вашего класса, пожалуйста. Особенно те проблемы, о которых ты говоришь, трудно понять, не видя этого.
  • 0
    отредактировано извините, пожалуйста дайте мне знать, если у вас есть вопросы
Показать ещё 3 комментария
Теги:
class
structure
inheritance

3 ответа

1
Лучший ответ

Определение вашей функции в.cpp не связано с классом Exchange. Вам нужно будет написать:

void Exchange::parseTradePairs
         (Exchange::Currency curr, std::string response, int begin, int exit)
{
    // ...
}

Кроме того: в любом месте за пределами вашего класса вам необходимо использовать Exchange::Currency для доступа к типу.

1

Если вы создаете Currency в рамках метода класса, это должно работать нормально. Но если вы создаете Currency другом месте, вам нужно развернуть ее с именем класса.

Т.е. ClassName::Currency

Конечно, Currency должна быть видимой в том объеме, в котором вы это делаете, и public следует позаботиться об этом.

  • 0
    Нет! Это не основная проблема.
0

(Примечание: это не ответ на редактируемый вопрос, 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++.

  • 0
    Нет! Это не основная проблема.
  • 0
    @ g-makulik Да, написал это перед редактированием ... Не могу проверить прямо сейчас, компилируется ли typedef без нового имени типа?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню