You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VS编译C++项目报错:无法实例化抽象类等问题求助

C++项目编译错误求助

项目文件

Init.h

#pragma once

#include <iostream>
#include <memory>

#include "Ishare.h"

using namespace std;

class Init {
private:
  std::unique_ptr<IfShare> p_ifShare;
  int constData;
  int varData;

public:

  Init(const IfShare& ifshareInit, int constDataInit) :
    p_ifShare(std::make_unique<IfShare>(ifshareInit)) {
    varData = 10;
    cout << "Init带参构造函数被调用" << endl;
    cout << "varData:" << varData << " constDataInit:" << constDataInit << endl;
  }

  Init(const Init& initInstance) : 
    p_ifShare(std::make_unique<IfShare>(initInstance.p_ifShare)),
    constData(initInstance.constData){
    varData = 100;
    cout << "Init拷贝构造函数被调用" << endl;
    cout << "varData:" << varData << " constDataInit:" << initInstance.constData << endl;
  }
};

void InitFunc();

Init.cpp

#include "Init.h"
#include "share.h"

void InitFunc() {
  std::unique_ptr<Init> InitImpl = std::make_unique<Init>(InitShareFunc());
}

Ishare.h

#pragma once

class IfShare {
public:
  virtual void sharePrint1() = 0;
  virtual void sharePrint2() = 0;
};

share.h

#pragma once

#include <iostream>
#include "Ishare.h"
#include "Init.h"

class Share : public IfShare {
public:
  void sharePrint1() {
    std::cout << "sharePrint1" << std::endl;
  }
  void sharePrint2() {
    std::cout << "sharePrint2" << std::endl;
  }
};

class App {
public:
  App(const Share& IfShareData, int data) {
    InitShare = std::make_unique<Init>(IfShareData, data);
  }

  friend const Init& InitShareFunc();

private:
  std::unique_ptr<Init> InitShare;
};

mainApp.cpp

#include <iostream>
#include <memory>

#include "share.h"

using namespace std;

static std::unique_ptr<App> p_App;
static std::unique_ptr<Share> p_Share;

const Init& InitShareFunc() {
  return *(p_App->InitShare.get());
}

int main()
{
  int x = 20;
  p_Share = std::make_unique<Share>();
  p_App = std::make_unique<App>(*(p_Share.get()), x);
  InitFunc(); // 实际应用中由外部插件调用,测试时放在此处
  return 0;
}

设计意图

  • 主应用:初始化共享对象并传递给App对象
  • App:持有Init对象的唯一所有权,通过友元函数共享该对象
  • IShare:纯虚类,用于将Init的调用路由到Share类
  • Init:从App的Init对象获取引用,通过IShare调用Share的成员函数

核心思路:App实例独占Init对象,InitFunc()始终基于该对象创建本地Init实例

编译错误信息

Severity    Code    Description Project File    Line
Error (active)      member "Init::p_ifShare" (declared at line 12 of "c:\Users\nxf92615\Documents\Visual Studio 2015\Projects\Project3\Project3\Init.h") is inaccessible    Project3    c:\Users\nxf92615\Documents\Visual Studio 2015\Projects\Project3\Project3\Init.cpp  6
Error   C2259   'IfShare': cannot instantiate abstract class    Project3    c:\program files (x86)\microsoft visual studio 14.0\vc\include\memory   1636
Error   C2664   'IfShare::IfShare(IfShare &&)': cannot convert argument 1 from 'const std::unique_ptr<IfShare,std::default_delete<_Ty>>' to 'const IfShare &'   Project3    c:\program files (x86)\microsoft visual studio 14.0\vc\include\memory   1636
Error   C2259   'IfShare': cannot instantiate abstract class    Project3    c:\program files (x86)\microsoft visual studio 14.0\vc\include\memory   1636
Error   C2664   'IfShare::IfShare(IfShare &&)': cannot convert argument 1 from 'const std::unique_ptr<IfShare,std::default_delete<_Ty>>' to 'const IfShare &'   Project3    c:\program files (x86)\microsoft visual studio 14.0\vc\include\memory   1636

求助问题

无法理解上述编译错误的原因,请求帮忙分析并解决。


内容的提问来源于stack exchange,提问作者chandu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 07:17:04