0

オブジェクトが作成されないのはなぜですか?そして、コンストラクターから
どのように実行できますか?AllReferrals.push_back(this);

私がそうするとき、私は言われます

エラーC2065:'AllReferrals':宣言されていない識別子

と同様

エラーC2228:「。push_back」の左側にはclass / struct/unionが必要です

リストの初期化をクラスの前に置くと、

エラーC2065:'AllReferrals':宣言されていない識別子

これが私のコードです:

class Referral
{
public:
    string url;
    map<string, int> keywords;

    static bool submit(string url, string keyword, int occurrences)
    {
        //if(lots of things i'll later add){
        Referral(url, keyword, occurrences);
        return true;
        //}
        //else
        //    return false;
    }

private:
    list<string> urls;

    Referral(string url, string keyword, int occurrences)
    {
        url = url;
        keywords[keyword] = occurrences;
        AllReferrals.push_back(this);
    }
};

static list<Referral> AllReferrals;

int main()
{
    Referral::submit("url", "keyword", 1);
}
4

3 に答える 3

3

AllReferrals名は、ファイルを上から下に読み取るときに使用する前に宣言する必要があります。

宣言されていない場合、コンパイラはそれが存在することを認識しません。それはエラーが言うことです。

問題を解決するには、宣言を使用する前に移動し、名前が必要であるがまだ定義されていない型に対して「前方宣言」を使用します。

#include <iostream>
#include <fstream>
#include <regex>
#include <string>
#include <list>
#include <map>

using namespace std;
using namespace tr1;

class Referral; // forward declaration
list<Referral> AllReferrals; // here 'static' is not needed

class Referral
{
public:
 string url;
 map<string, int> keywords;

 static bool submit(string url, string keyword, int occurrences)
 {
  //if(lots of things i'll later add){
   Referral(url, keyword, occurrences);
   return true;
  //}
  //else
  // return false;
 }

private:
 list<string> urls;

 Referral(string url, string keyword, int occurrences)
 {
  url = url;
  keywords[keyword] = occurrences;
  AllReferrals.push_back(this);
 }
};


int main()
{
 Referral::submit("url", "keyword", 1);
 cout << AllReferrals.size();
 cout << "\n why does that ^^ say 0  (help me make it say one)?";
 cout << "\n and how can i AllReferrals.push_back(this) from my constructor?";
 cout << " When I do it like so, I am told  error C2065: 'AllReferrals' : undeclared identifier";
 cout << " as well as error C2228: left of '.push_back' must have class/struct/union.";
 cout << " If I put the list initialization before the class I get error C2065: 'AllReferrals' : undeclared identifier.";
 cout << "\n\n\t Thanks!";
 getchar();
}

コメント提供者が付け加えたように、別の解決策は、コンストラクター定義をAllReferrals定義の下に移動することです。とにかく、それは常に名前の出現順序の問題です。

于 2009-09-03T22:06:42.910 に答える
2

最初の問題は、AllReferralsを使用する前に宣言する必要があることです。ただし、紹介クラスは、AllReferralを宣言する前に定義する必要があります。これは、次のように、Referralコンストラクターの宣言と定義を分割することで解決できます。

.
.
.
    Referral(string url, string keyword, int occurrences); // declaration
};

static list<Referral> AllReferrals;

Referral::Referral(string url, string keyword, int occurrences) // definition
{
    url = url;
    keywords[keyword] = occurrences;
    AllReferrals.push_back(this);
}
.
.
.

次に、それがポインタであることを理解する必要がありthis、実際のオブジェクトデータを格納するためのリストを宣言しました。これは2つの方法で解決できます。

  • に変更AllReferrals.push_back(this);AllReferrals.push_back(*this);ます。これにより、オブジェクトのコピーがリストに配置されます。これは正常に機能しますが、パフォーマンスに影響を与える可能性があります。

  • の宣言をstatic list<Referral> AllReferrals;に変更しstatic list<Referral *> AllReferrals;ます。Referralローカルで作成されているため、これだけでは機能するコードは得られません。オブジェクトsubmit()を離れるとsubmit()、オブジェクトは破棄され、ポインタがぶら下がったままになります。に変更Referral(url, keyword, occurrences);するsubmit()と、オブジェクトはdnew Referral(url, keyword, occurrences);まで持続します。ただし、この方法で作成したすべてのオブジェクトをdelete使い終わったら確認する必要があります。そうしないと、メモリリークが発生します。永続的ではなく、アプリケーションの終了時にOSがクリーンアップされますが、問題が発生する可能性があります。あなたはそれらをたくさん作成することを計画しています。deleteReferral

于 2009-09-03T22:14:42.657 に答える
1

次のようなものを試してください。

...

class Referral;

static list<Referral> AllReferrals;

class Referral
{
...
};
于 2009-09-03T22:13:29.807 に答える