【问题标题】:ISO C++ forbids declaration of '...' with no typeISO C++ 禁止声明没有类型的“...”
【发布时间】:2016-09-03 20:04:34
【问题描述】:

我收到来自 cpp 编译器的警告,我似乎无法解决。我想至少了解我做错了什么......

sketch\IRectangle.h:7:20: 警告:ISO C++ 禁止声明 没有类型的“矩形”[-fpermissive]

矩形(int,int);

                ^

头文件

#ifndef RECTANGLE_H
#define RECTANGLE_H

class IRectangle
{
public:
  Rectangle(int,int);
  void set_values (int,int);
  int area (void);

private:
  int width, height; 
};

#endif

矩形实现

#include "IRectangle.h"

IRectangle::Rectangle(int width, int height)
{

}

void IRectangle::set_values (int a,int b)
{
}

int IRectangle::area()
{
  return 0;
}

谷歌搜索后,我遇到了thisthis 线程,但我三次检查原型是否匹配,所以我真的不知道我做错了什么。

PS: 在 C++ 中可以在 interface 前加上 'I' 前缀吗?

【问题讨论】:

  • Rectangle(int,int);IRectangle(int,int); 不一样 "PS: 在 C++ 中,接口可以加上'I'前缀吗?" 可以。但是构造函数对接口没有意义。
  • PS:在 C++ 中可以在 interface 前加上 'I' 前缀吗? 编译器不关心你是否这样做。就个人而言,我认为如果有必要,那可能意味着您的类层次结构太复杂了。
  • @zwol 对,当我看到答案时,我也明白了。谢谢指出。这一直是我的问题......
  • 我怀疑在这种情况下I 代表“整数”而不是“接口”。我看不到任何虚拟功能。但是当你开始添加这样的类型前缀时,你真的应该考虑template

标签: c++


【解决方案1】:

构造函数必须与类同名。如果类命名为IRectangle,则构造函数必须命名为IRectangle

【讨论】:

  • 啊哈,我想这也回答了 PS,我不应该在接口前加上“I”。我现在明白了,谢谢!
  • @bas:不,它没有;你可以打电话给班级RectangleIRectangleUrgleBurgle .. 真的随你喜欢。但是类的构造函数声明必须使用类的名称,而不是其他名称。 (构造函数实际上并没有自己的名字,尽管看起来,并且尽管这个答案暗示了什么。)最后,你的类没有任何人通常会称之为“接口”的东西。
  • @LightnessRacesinOrbit 我确实还不在那里。我通过将构造函数更改为IRectangle::IRectangle(int width, int height) {} 解决了警告,并在类(/接口)定义中进行了类似的更改:IRectangle(int a, int b);。但是,如果您的同事编写了这样的代码,您会感激吗?我仍在谷歌搜索并希望找到一个适当的 C++ 类的示例:接口示例。也许你可以把我推向正确的方向?
  • @bas:不是不知道您要完成什么或问题是什么,不。你有一个工人阶级,那有什么问题?不过,我仍然不明白你为什么认为它是一个“接口”,所以 IRectangle 这个名字是一个奇怪的选择。
  • @LightnessRacesinOrbit,我可能有错误的思维定势(C#/Java/Python)。在那里我有一个实现接口(例如 IRectangle)的类(例如 Rectangle)。所以例如对于测试驱动的开发来说,这会很棒,这样我就可以模拟 Rectangle 类并只测试“被测对象”。请注意; Rectangle 类对我来说只是一个愚蠢的开始,我试图重新熟悉 C++(自从我在 C++ 中活跃以来真的很长时间了,因此可能是愚蠢的问题......)
猜你喜欢
  • 2011-08-21
  • 1970-01-01
  • 2015-10-31
  • 2020-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多