编译器似乎不接受代理类
Posted
技术标签:
【中文标题】编译器似乎不接受代理类【英文标题】:the compiler doesn't seem to accept Agent class 【发布时间】:2009-11-18 16:16:02 【问题描述】:可能答案很愚蠢,但如果你愿意的话,我需要一双新鲜的眼睛来发现问题。这是 _tmain 的摘录:
Agent theAgent(void);
int m = theAgent.loadSAG();
这是agent.h,我包含在_tmain中:
#ifndef AGENT_H
#define AGENT_H
class Agent
public:
Agent(void);
int loadSAG(void);
~Agent(void);
;
#endif
和agent.cpp相关函数:
int Agent::loadSAG(void)
return 3;
那么为什么我会收到这个错误:错误 C2228: left of '.loadSAG' must have class/struct/union ?
提前致谢。
【问题讨论】:
是代理 theAgent(void);函数声明? 编译器是这么想的,但这不是本意。 【参考方案1】:Agent theAgent(void);
这是一个函数声明,改成:
Agent theAgent;
【讨论】:
另外,你不需要在不带参数的函数中写void
实际上我以前从来没有像这样使用过 void,但是我使用 VC++ 生成器来上课,我想这到底是怎么回事,让我们坚持下去。所以..解决了:)【参考方案2】:
编译器认为
Agent theAgent(void);
这是一个函数声明。
Agent theAgent;
【讨论】:
注意第二个选项,但是,您将调用赋值运算符。 其实是拷贝构造函数。但我还是把它删了,因为我不喜欢这种风格。 实际上两者都不是(令我惊讶的是)。我发布了这个问题,NRVO 优化了复制构造函数【参考方案3】:线
Agent theAgent(void);
实际上被编译器视为声明了函数theAgent
,它不接受任何参数并返回一个代理。
这是C++ FAQ Lite的解释。
要调用默认构造函数并设置Agent
类型的对象(与上面解释为函数声明的语句相反),您可以只声明theAgent
而不使用括号,如:
Agent theAgent;
所有正常的成员调用,例如loadSAG
将在此之后按预期工作。
作为替代方案,如果您必须将对象放在堆上,请改用:
Agent* theAgent = new Agent(); // Notice the *
theAgent->loadSAG(); // Use -> instead of .
// The code where theAgent is used
delete theAgent; // This frees the memory allocated by new
【讨论】:
【参考方案4】:在调用默认(无参数)构造函数时,您可以不使用“()”。 IE。尝试构建您的代理对象:
Agent theAgent;
【讨论】:
【参考方案5】:如果通过
Agent theAgent(void);
你的意思是函数声明,那么你可能忘记在函数调用中添加()
int m = theAgent().loadSAG();
如果您想定义一个名称为theAgent
的变量,那么您已经添加了额外的(void)
。
相反,你应该写
Agent theAgent;
【讨论】:
这不只是尝试在“theAgent”对象上调用一个 operator(),它没有定义一个,但如果有,它会尝试使用 .loadSAG( );关于 () 运算符的返回值... 这对初学者没有帮助。如果你要这样作弊,至少解释一下你在做什么疯狂的胡言乱语。 回答问题我认为在问题中它是一个函数声明。【参考方案6】:试试
Agent theAgent = new Agent();
theAgent.loadSAG();
错误消息显示您在尝试使用代理对象之前从未实例化它。
【讨论】:
这可能有效(而且确实有效,因为您使用的是默认的复制构造函数),但 它会泄漏内存。 这是因为您正在分配new Agent
(在堆上分配)到theAgent
。由于 C++ 没有进行垃圾回收,并且您没有保留对要删除的已分配内存的引用,因此在程序终止之前不会回收该内存。不要这样做。
@Cristian。你是对的,但这超出了他提出的问题。 @那些认为 C++ 中没有 new 运算符并决定否决提出问题的人接受的答案的人。你错了。
@ChadNC:我没有投反对票,因为“我认为 C++ 中没有新的运算符”,我投反对票是因为它使用不当。要在不泄漏内存的情况下使用new
运算符,您需要将theAgent
设为Agent*
,并且将使用指向成员运算符->
的指针访问所有成员。这使得指针可以访问,以便内存可以在以后delete
d。
@ChadNC:不要介意内存泄漏,theAgent
必须是 Agent*
才能让它在 C++ 中编译。
@Troubadour:嘿,我错过了那个。很好的收获。以上是关于编译器似乎不接受代理类的主要内容,如果未能解决你的问题,请参考以下文章
GoogleTagManager似乎不接受base64编码的图片