基本上,我试图为派生类创建一个动态数组,基类与另一个类具有组合关系。
这是我正在使用的类
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包含
class PhotoLab{
public:
PhotoLab();
PhotoLab(Image*);
PhotoLab(Image*, int);
virtual ~PhotoLab();
.
.
virtual void newProject()=0;
protected:
Image* I;
int Num;
virtual void trans()=0;};和图像类
class Image{
public:
// Image();
Image(string="");
~Image();
.
.
void load(string);
.
.
private:
string magicNo;
int H, W, colorSystem;
RGB** pixels;
string ID;};回到类专辑中,我试图创建I的动态数组,这是我使用的函数:
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?? 我在搞什么,为什么不对?
发布于 2015-12-05 15:34:16
在您的函数中,您使用的是变量I,它是一个图像数组(您是这样使用new[]创建的)。然后,将索引输入到are中,然后将其类型为Image。这是一个错误,使用新操作符创建一个新图像,但是这个操作符返回一个Image*。编译器无法将Image*转换为Image,因此会出现错误。
解决这一问题的最简单方法是将I声明为指向图像的指针数组。
Image** I;然后在您的方法中创建一个图像指针数组:
I = new Image*[num];
for(int i = 0; i < num; i++)
{
I[i] = new Image(names[i]);
}发布于 2015-12-05 15:33:08
您正在尝试将指针分配给类类型。
试试这个:
PhotoLab中的PhotoLab更改为Image** I;Album::newProject()中的Album::newProject()更改为I=new Image*[Num];发布于 2015-12-05 15:35:40
I对象显然是一个Image[],即Image对象的数组。
当您new一个Image时,您将得到一个指向Image的指针。您正在尝试将Image (即I[i])设置为包含Image*。
一句忠告:多态容器应该真正地存储一些实际对象的引用类型,也就是说,unique_ptr<Image>可能是最好的。
另一个建议是:除非你(非常)有经验,或者有(很多)时间来调试内存问题,否则不要乱搞C风格的数组。使用std::vector代替:
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>。
std::vector<Image> I;
...
for( int i=0; i != Num; ++i) {
I.emplace_back( names[i] ); // will construct an Image in place
}https://stackoverflow.com/questions/34107189
复制相似问题