编译器似乎不接受代理类

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*,并且将使用指向成员运算符-> 的指针访问所有成员。这使得指针可以访问,以便内存可以在以后deleted。 @ChadNC:不要介意内存泄漏,theAgent 必须是 Agent* 才能让它在 C++ 中编译。 @Troubadour:嘿,我错过了那个。很好的收获。

以上是关于编译器似乎不接受代理类的主要内容,如果未能解决你的问题,请参考以下文章

派生类不从基类继承重载方法

代理模式

GoogleTagManager似乎不接受base64编码的图片

默认构造函数,为啥我的类似乎有三个?当编译器将类视为结构时?

AOP 有哪些实现方式?

编译器似乎没有找到类 llvm::Instruction 的成员函数