首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分配另一个类类型的新数组值

分配另一个类类型的新数组值
EN

Stack Overflow用户
提问于 2015-12-05 15:26:33
回答 3查看 61关注 0票数 0

基本上,我试图为派生类创建一个动态数组,基类与另一个类具有组合关系。

这是我正在使用的类

代码语言:javascript
复制
class Album:public PhotoLab{
public:
Album(string);
Album(Image* ,string);
~Album();
void newProject(); //This is the function I'm working on
.
.
private:
string title;
string* names;
};

类PhotoLab包含

代码语言:javascript
复制
class PhotoLab{
public:
PhotoLab();
PhotoLab(Image*);
PhotoLab(Image*, int);
virtual  ~PhotoLab();
.
.
virtual void newProject()=0;

protected:
Image* I;
int Num;
 virtual void trans()=0;};

和图像类

代码语言:javascript
复制
class Image{
public:
// Image();
 Image(string="");
 ~Image();
.
.

 void load(string);
.
.
private:
 string magicNo;
 int H, W, colorSystem;
 RGB** pixels;
 string ID;};

回到类专辑中,我试图创建I的动态数组,这是我使用的函数:

代码语言:javascript
复制
void Album::newProject(){
 cout<<"Number of images: ";
cin>>Num;
names=new string [Num];
for(int i =0;i<Num;i++){
    cout<<"Image("<<i+1<<") Name: ";
    cin>>names[i];}

    I=new Image[Num];
    for (int i=0;i<Num;i++){
        I[i]=new Image(names[i]);} // I got An error here when I tried to make and object of class Image?? 

我在搞什么,为什么不对?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-12-05 15:34:16

在您的函数中,您使用的是变量I,它是一个图像数组(您是这样使用new[]创建的)。然后,将索引输入到are中,然后将其类型为Image。这是一个错误,使用新操作符创建一个新图像,但是这个操作符返回一个Image*。编译器无法将Image*转换为Image,因此会出现错误。

解决这一问题的最简单方法是将I声明为指向图像的指针数组。

代码语言:javascript
复制
Image** I;

然后在您的方法中创建一个图像指针数组:

代码语言:javascript
复制
I = new Image*[num];
for(int i = 0; i < num; i++)
{
    I[i] = new Image(names[i]);
}
票数 0
EN

Stack Overflow用户

发布于 2015-12-05 15:33:08

您正在尝试将指针分配给类类型。

试试这个:

  1. PhotoLab中的PhotoLab更改为Image** I;
  2. Album::newProject()中的Album::newProject()更改为I=new Image*[Num];
票数 0
EN

Stack Overflow用户

发布于 2015-12-05 15:35:40

I对象显然是一个Image[],即Image对象的数组。

当您new一个Image时,您将得到一个指向Image的指针。您正在尝试将Image (即I[i])设置为包含Image*

一句忠告:多态容器应该真正地存储一些实际对象的引用类型,也就是说,unique_ptr<Image>可能是最好的。

另一个建议是:除非你(非常)有经验,或者有(很多)时间来调试内存问题,否则不要乱搞C风格的数组。使用std::vector代替:

代码语言:javascript
复制
std::vector<std::unique_ptr<Image>> I;

for (int i=0; i!=Num; ++i) {
    I.push_back( std::make_unique<Image>(names[i]) );
}

但!

可能您甚至不需要一个多态容器I:然后使用一个简单的std::vector<Image>

代码语言:javascript
复制
std::vector<Image> I;

...

for( int i=0; i != Num; ++i) {
    I.emplace_back( names[i] ); // will construct an Image in place
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34107189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档