为什么不创建我的对象?
如何从构造函数中执行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);
}
答案 0 :(得分:3)
在您从上到下阅读文件时,必须在使用之前声明AllReferrals名称。
如果未声明,编译器不知道它存在。这就是错误所说的。
要解决您的问题,只需在使用之前移动声明,并使用“forward declaration”作为您需要名称但尚未定义的类型。
#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定义下移动构造函数定义。 无论如何,它总是一个名称幻影订单问题。
答案 1 :(得分:2)
您的第一个问题是必须先声明AllReferrals才能使用它。但是,必须在声明AllReferrals之前定义Referral类。您可以通过拆分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
是一个指针,你已经声明了你的列表来存储实际的对象数据。您可以通过两种方式解决此问题:
将AllReferrals.push_back(this);
更改为AllReferrals.push_back(*this);
。这将导致该对象的副本被放置在列表中,这将只是工作但可能会影响性能。
将static list<Referral> AllReferrals;
的声明更改为static list<Referral *> AllReferrals;
。这本身不会给你工作代码,因为Referral
是在submit()
本地创建的,当你离开submit()
时,对象将被丢弃并且指针悬空。您可以将Referral(url, keyword, occurrences);
中的submit()
更改为new Referral(url, keyword, occurrences);
,这会导致对象持续到delete
d;但是你必须确保delete
当你完成它们时以这种方式创建的所有Referral
个对象,否则你会泄漏内存 - 不是永久性的,操作系统会在你完成后清理应用程序终止,但如果您计划创建大量应用程序,则可能会导致问题。
答案 2 :(得分:1)
尝试更像这样的事情:
...
class Referral;
static list<Referral> AllReferrals;
class Referral
{
...
};