花了很长时间在C#中开发,我注意到如果为了将它用作接口而声明一个抽象类,则无法实例化该抽象类的向量来存储子类的实例.
#pragma once
#include <iostream>
#include <vector>
using namespace std;
class IFunnyInterface
{
public:
virtual void IamFunny() = 0;
};
class FunnyImpl: IFunnyInterface
{
public:
virtual void IamFunny()
{
cout << "<INSERT JOKE HERE>";
}
};
class FunnyContainer
{
private:
std::vector <IFunnyInterface> funnyItems;
};
Run Code Online (Sandbox Code Playgroud)
声明抽象类向量的行在MS VS2005中导致此错误:
error C2259: 'IFunnyInterface' : cannot instantiate abstract class
Run Code Online (Sandbox Code Playgroud)
我看到一个明显的解决方法,即用以下内容替换IFunnyInterface:
class IFunnyInterface
{
public:
virtual void IamFunny()
{
throw new std::exception("not implemented");
}
};
Run Code Online (Sandbox Code Playgroud)
这是一个可接受的解决方案C++明智吗?如果没有,是否有像boost这样的第三方库可以帮我解决这个问题?
谢谢您阅读此篇 !
安东尼
通常,当我编程时,我使用多态,因为它自然地模拟我需要的对象.另一方面,我经常使用标准容器来存储这些对象,我倾向于避免使用指针,因为这要求我释放对象而不是将它们从堆栈中弹出或要求我确定对象将保持不变我使用指针时的堆栈.当然有各种各样的指针容器对象可以为你完成这项任务,但根据我的经验,它们也不理想甚至烦人.那是; 如果存在这样一个简单的解决方案,它本来就是用c ++语言,对吧?;)
所以让我们有一个经典的例子:
#include <iostream>
#include <vector>
struct foo {};
struct goo : public foo {};
struct moo : public foo {};
int main() {
std::vector<foo> foos;
foos.push_back(moo());
foos.push_back(goo());
foos.push_back(goo());
foos.push_back(moo());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
请参阅:http://ideone.com/aEVoSi.这工作正常,如果对象具有不同的sizeof,编译器可能会应用切片.但是,由于c ++不知道像Java这样的实例,并且据我所知,没有足够的替代存在,在从向量中获取它们作为foo之后,无法访问继承类的属性.
因此,人们将使用虚函数,但是这不允许一个人分配foo,因此不允许在向量中使用它们.请参阅为什么我们不能声明std :: vector <AbstractClass>?.
例如,我可能希望能够打印两个子类,简单的功能,对吗?
#include <iostream>
#include <vector>
struct foo {
virtual void print() =0;
virtual ~foo() {}
};
struct goo : public foo {
int a;
void print() { std::cout << "goo"; }
};
struct …Run Code Online (Sandbox Code Playgroud) 我有一个循环,我使用一个函数将std :: unique_ptr返回给抽象类的对象.我想通过push_back将这些对象存储到std :: vector中.但由于对象是抽象类型,我得到以下错误:
error: cannot allocate an object of abstract type
Run Code Online (Sandbox Code Playgroud)
为线
cells.push_back(std::move(*cell));
Run Code Online (Sandbox Code Playgroud)
其中,cell是std::vector抽象类型的类型,并且cell是类型
std::unique_ptr<AbstractType>&& cell
Run Code Online (Sandbox Code Playgroud)
(我实际上传递cell给一个处理程序类)我知道一个人不能实例化一个抽象类型,因为我理解std:move操作符需要以某种方式实例化对象?
任何人都可以帮我解决问题吗?或者函数(不是我的项目部分)是否应该返回一个指向抽象类型对象的唯一指针?