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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!