2 a810783926 a810783926 于 2016.02.14 17:29 提问

error C2079 类的前置声明

如下代码,可运行:
void A();

void test()
{
A();
}

void A() {};
但是我把void改成class时候却运行失败:
class A;

void test()
{
A a;
}

class A {};
当然如果用指针的话还是可以的,然而并没什么用,因为指针声明后就没有然后了。

5个回答

caozhy
caozhy   Ds   Rxr 2016.02.14 19:33
已采纳
 class A;

void test();

class A 
{
public:
    int x;
    A() {}
};

void test()
{
    A *a = new A();
    a->x = 1;
}

int main()
{
    test();
}
a810783926
a810783926 靠 牛掰啊 厉害厉害 本来不抱有希望了 看来把函数声明在头文件还是有大用的 本来不想说 现在还是说了吧 91programxxx就和论坛里另一个赵4老师一样 都不好好做事 总是弄些模棱两可的答案让提问者自己去琢磨,来这提问的哪个不是百度谷歌过再来这里提问的呢,哪个不是自己想了又想,写了一遍又一遍的代码后再来的呢?
2 年多之前 回复
caozhy
caozhy   Ds   Rxr 2016.02.14 17:59

因为指针声明后就没有然后了。
什么意思?为什么没用?

A *a = new A();
a->成员

a810783926
a810783926 因为A *a; 后连new都是非法的 编译器就会报警错误 所以没有然后了
2 年多之前 回复
a810783926
a810783926   2016.02.14 18:34

如果A a;的话 error C2079: “a”使用未定义的 class“A”
如果 A * a = new A;的话 error C2512: “A”: 没有合适的默认构造函数可用
即使我添加了构造函数

class A;
void test()
{
A * a = new A;
}
class A {
public:
A() {}
};

a810783926
a810783926 百度谷歌我看过 但是为什么函数void可以 类class就不可以了呢
2 年多之前 回复
a810783926
a810783926 void a(); void b(); void a(){b();} void b(){a();} 编译这段代码看看 如果把类置换成函数就可以了呢
2 年多之前 回复
91program
91program 或者,使用搜索引擎:https://www.baidu.com/s?wd=class20%E5%89%8D%E7%BD%AE%E5%A3%B0%E6%98%8E&rsv_spt=1&rsv_iqid=0xcf7956c9000f669e&issp=1&f=3&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&oq=class&rsv_t=2d7cMpKaY1KiWYx%2Bz5kjaqH0K%2FocDrAGdcj5bNzoV1EPDsVjssWgC%2FEMl7tNssND6N6Y&rsv_pq=a2e68f4100119016&rsv_sug2=1&prefixsug=%3Class%20%20%E5%89%8D&rsp=0&rsv_sug7=000&inputT=14774&rsv_sug4=14774
2 年多之前 回复
91program
91program http://blog.csdn.net/yunyun1886358/article/details/5672574
2 年多之前 回复
91program
91program 看看这个链接:
2 年多之前 回复
a810783926
a810783926   2016.02.14 18:28

你们两个不是冤家吗 居然被我碰到了

caozhy
caozhy 不是的,那个人比较另类,大家都知道的。
2 年多之前 回复
91program
91program   Ds   Rxr 2016.02.14 17:52

指针定义后,需要 new,之后和非指针定义的变量是一样的。

a810783926
a810783926 class A; void test() { A * a = new A; } class A { public: A() {} };
2 年多之前 回复
a810783926
a810783926 在其它楼层
2 年多之前 回复
a810783926
a810783926 看楼下 代码不好贴我自己回答了下一楼
2 年多之前 回复
91program
91program 回复91program: 学习,也不是这样的。没有必须在混淆的情况去学习,自己写代码肯定是要避免这种情况出现的。
2 年多之前 回复
91program
91program 回复a810783926: 你的类名与函数名是相同的?这样编译肯定不行。建议你不要搞这样的、容易混淆的东东。
2 年多之前 回复
a810783926
a810783926 A a;更是不行,铁定报错
2 年多之前 回复
91program
91program 回复a810783926: 报错,具体的错误信息是什么?
2 年多之前 回复
a810783926
a810783926 A *a = new A; 是会报错的
2 年多之前 回复
a810783926
a810783926 仅仅只能A *a; 如果new A;就会报错
2 年多之前 回复
91program
91program A *a 后才需要new,而 A a 后是不需要 new 的。
2 年多之前 回复
91program
91program A *a
2 年多之前 回复
a810783926
a810783926 因为A *a; 后连new都是非法的 编译器就会报警错误 所以没有然后了
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
C++中的前置声明
超前引用(类的提前声明)出错:error C2079: 'xxx' uses undefined class '***' 分类: C/C++2010-10-18 12:57 945人阅读 评论(1) 收藏 举报 classc编译器 错误如下: error C2079: 'xxx' uses undefined class '***' 比如说,我们先定义一个b类再
error C2079 使用未定义的class 和 error C2011 ‘class’类型重定义
error C2079 使用未定义的class 问题原因:在于.h文件引用的顺序不对,在系统编译的时候是由上至下编译头文件的。 解决方法:(1) 添加头文件的时候基类文件在上,基于基类的子类头文件在其下,先编译基类再编译子类;                     (2)若b.h中用到了a.h中的内容,c.h需要用到b.h和a.h的内容,则先添加a.h再添加b.h。 error
超前引用(类的提前声明)出错:error C2079: 'xxx' uses undefined class '***'
超前引用(类的提前声明)出错:error C2079: 'xxx' uses undefined class '***'
WinPcap编程错误:error C2079: 'IPAddress' uses undefined struct 'sockaddr_storage的解决办法
出现这个问题的原因一般是由于Winsock的版本和IPv4和IPv6的版本兼容性问题。由于新版的 Winpcap 完全使用了新的 Winsock(支持IPv6),因此这个问题可能影响到每一个已有程序。 以下是新旧两版的 packet32.h 之间的差异:【新版本】typedef struct npf_if_addr {    struct sockaddr_storage
C语言的不完整类型和前置声明
声明与定义(Declaration and Definition) 开始这篇文章之前,我们先弄懂变量的declaration和definition的区别,即变量的声明和定义的区别。 一般情况下,我们这样简单的分辨声明与定义的区别:建立存储空间的声明称之为“定义”,而把不需要建立存储空间的称之为“声明”。 其实更为准确地描述的话,变量的声明可以分为两种情况: (1)一种是需要建立存储空间的。
C++类中使用前置声明和使用include包含头文件的感想
C++前置声明和include包含辨析
对类前置声明和包含头文件的一点理解
转自 类的前置声明(forward declaration)和包含头文件(#include)的区别常常会迷惑我们,特别是涉及两个类相互包含的时候。因此我们有必要搞清楚二者的区别以及二者的适用场合。   首先我们需要问一个问题是:为什么两个类不能互相包含头文件?所谓互相包含头文件,我举一个例子:我实现了两个类:图层类CLayer和符号类CSymbol,它们的大致关系是图层里包含有符
带命名空间的类的前置声明
A.h #pragma once namespace TEST { class A { public: A(void) { } virtual ~A(void) { } }; }
类前置声明的使用
类前置声明的使用!
c++之类的前置声明
        原创文章,转载请注明出处,谢谢!               作者:清林,博客名:飞空静渡 刚开始学习c++的人都会遇到这样的问题:定义一个类 class A,这个类里面使用了类B的对象b,然后定义了一个类B,里面也包含了一个类A的对象a,就成了这样://a.h#include "b.h"class A{....private: