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();
}

new Currency() 呼び出しの予期される型指定子と表示されます。私が欠けているものはありますか、それとも構造をこのように使用すべきではありませんか?

クラス交換{パブリック:

    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 にあります。

4

3 に答える 3

1

クラスのメソッド内でインスタンス化する場合Currency、これは正常に機能するはずです。ただし、Currency他の場所でインスタンス化する場合は、クラスの名前でスコープを設定する必要があります。

いえClassName::Currency

もちろんCurrency、それを行う範囲で見える必要があり、それを作成することでそれを処理するpublic必要があります。

于 2013-10-28T19:21:40.140 に答える
1

Exchange.cpp の関数定義は、クラスに関連していません。次のように記述する必要があります。

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

Exchange::Currencyまた、タイプにアクセスするために使用する必要があるクラススコープ外の場所。

于 2013-10-28T19:24:06.943 に答える
0

(注:これは編集された質問への回答ではありません。削除を要求するには反対票を投じてください... :-)

1 つの問題は次のとおりです。

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キーワードを使用する必要がないように、2 番目または 3 番目の形式が使用されることがあります。多くのライブラリにはC と C++ の両方に同じ.hファイルがあるため、これは知っておくと便利です。

于 2013-10-28T19:21:54.397 に答える