【问题标题】:Error C2512 'DerivedClass' : no appropriate default constructor available错误 C2512 'DerivedClass':没有合适的默认构造函数可用
【发布时间】:2014-01-31 23:32:07
【问题描述】:

我遇到了这个错误的问题,添加默认构造函数并不能修复它。不使用默认构造函数编译会产生错误,使用默认构造函数编译会产生错误。我已经在网上搜索了几个小时,但一无所获。这是我的代码的一个简单示例(实际代码相当长):

//Header.h
using namespace std;

class BaseClass;
class DerivedClass;

BaseClass *MyClass = new DerivedClass;

class BaseClass
{
    virtual void myFunction()
    {
        cout << "Base Class";
    }
};

class DerivedClass : public BaseClass
{
    void myFunction()
    {
        cout << "Derived Class";
    }
};

//Main.cpp
#include <iostream>
#include "Header.h" //I believe this gives Header.h access to iostream 
                    //I believe it cause it works

using namespace std;

int main()
{
    cout << "Hello";
}

错误在 Header.h 中,Main 只是为了让 Header.h 访问 iostream。 正如我所说,我正在寻找 HOURS。并且还没有找到任何方法来修复错误: 错误 C2512:“DerivedClass”:没有合适的默认构造函数可用

【问题讨论】:

  • new DerivedClass 需要 DerivedClass 定义。你只有一个前向声明。您还需要在Header.h#include &lt;iostream&gt;

标签: c++ class pointers derived


【解决方案1】:

为什么在头文件中需要这个?

Baseclass *MyClass = new DerivedClass;

显然编译器正在寻找derived 类的定义,直到这一行执行才找到。

在实现derived 类之后或在main 中移动它。

【讨论】:

    【解决方案2】:
    Baseclass *MyClass = new DerivedClass;
    

    应该在类的定义之后,即文件结尾

    附:您在代码中的评论(关于授予对 iostream 的访问权限)是正确的。但考虑到这不是好的做法。头文件的编译应该不需要不同的包含。

    在 .h 中实例化 MyClass 对象也不是很好的做法。

    【讨论】:

    • 移动它会导致更多错误。将 BaseClass *MyClass = new DerivedClass 放在 main 的全局范围内会给我 8 个错误。错误 c2512 仍然存在,它添加了错误 C2605:'MyClass':未定义的标识符以及错误 C2541:'delete':当我尝试删除 MyClass 以分配另一个派生类时,无法删除不是指针的对象跨度>
    • 还有,把 Baseclass 改成 BaseClass ,之前没注意
    • 这是我在 VS2010 ideone.com/ogt3cu 中所做的一个更好的例子,这个有错误。如果涉及到它,我可能不得不最终复制粘贴我的整个头文件 -_-"
    【解决方案3】:

    你的程序完全无效。

    您为 DerivedClass 类分配内存,但尚未定义。

    Baseclass *MyClass = new DerivedClass;
    

    你使用标准输出流

    cout << "Base Class";
    

    但是还没有声明,因为声明流的地方没有对应的header。

    函数myFunction的定义没有意义,因为它有私有访问控制,不能在类本身的方法之外调用,但没有这样的方法。

    正确的代码如下所示

    //Header.h
    #include <iostream>
    using namespace std;
    
    class BaseClass
    {
    public:
        virtual void myFunction() const
        {
            cout << "Base Class";
        }
    };
    
    class DerivedClass : public BaseClass
    {
    public:
        void myFunction() const
        {
            cout << "Derived Class";
        }
    };
    
    //Main.cpp
    #include <iostream>
    #include "Header.h" //I believe this gives Header.h access to iostream 
                        //I believe it cause it works
    
    using namespace std;
    
    Baseclass *MyClass = new DerivedClass;
    
    int main()
    {
        cout << "Hello";
    }
    

    【讨论】:

    • 这是我正在尝试做的一个更好的例子,我准备放弃并使用 ifs ideone.com/ogt3cu
    • @user3189142 祝你好运。
    猜你喜欢
    • 2016-03-28
    • 2013-08-25
    • 2012-10-10
    • 2014-12-31
    • 2012-12-16
    • 2014-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多