代码之家  ›  专栏  ›  技术社区  ›  tyhenry

c++初始值设定项列表问题-错误:试图引用已删除的函数

  •  -1
  • tyhenry  · 技术社区  · 8 年前

    我第一次在c++中使用VS(2015),并且是一个新手,我不太擅长创建中等水平的代码。尝试做一些简单的事情-使用初始化器列表……但它抛出了以下错误:“C2280:试图引用已删除的函数”

    我有(User.h):

    class User {
    protected:
      ICoordinateMapper* _coordMapper;
    public:
      User(ICoordinateMapper coordinateMapper)
        : _coordMapper(coordinateMapper){}
    };
    

    如果我按如下方式重载构造函数,它运行正常:

    class User {
    protected:
      ICoordinateMapper* coordinateMapper;
    public:
      User(){}
      User(ICoordinateMapper* coordinateMapper)
        : _coordMapper(coordinateMapper){}
    };
    

    我的应用程序(通过openFrameworks)运行方式为:

    #include "ofApp.h"
    int main(){
      ... 
      ofRunApp(new ofApp());
    }
    

    附录h:

    #pragma once
    #include "ofMain.h"
    #include "User.h"
    class ofApp : public ofBaseApp{
    public:
      ...
      User user;
    }
    

    这是为什么?我以为在使用初始化器列表时不需要重载构造函数?还是我?

    1 回复  |  直到 8 年前
        1
  •  2
  •   Some programmer dude    8 年前

    在第一种变体中,您没有 User 默认构造函数,编译器不会为您创建默认构造函数。这意味着无法默认构造(就像在 ofApp 类)的对象 使用者

    有两种方法可以解决这个问题:第一种是您已经知道的方法,即创建默认构造函数。作为此的变体,您可以使用编译器默认构造函数,方法是:

    class User {
      ...
      User() = default;
      ...
    };
    

    class User {
      ...
      User(ICoordinateMapper coordinateMapper = nullptr)
        : _coordMapper(coordinateMapper){}
      ...
    };
    

    我建议使用第二种方法,因为它将初始化 _coordMapper 成员