小白求救~~动态数组,指针,继承,面向对象c++

Tiger是Animal的子类
TigerArr是一个指针指向一组指向Tiger的指针

    Animal **AnimalArr;
    Tiger **TigerArr;
    void f(Animal **arr, int num);//函数原型
    void f(Animal **arr, int num)
{
    for (int i = 0; i < num; i++)
    {
        arr[i] = new Animal*(50);//错误一
//cannot initialize a new value of type 'Animal *' with an rvalue of type 'int'
    }
}
call f:
f(TigerArr, tigernum);
错误二:
 cannot initialize a parameter of type 'Animal **' with an lvalue of type 'Tiger **'

Animal 构造函数

 Animal::Animal(const int basef)
    : BaseFoodCost(10)
{
    A = 1;
    C = 0;
    N = 0;
    P = 0;
}

 Tiger::Tiger(const int basef) : Animal(50)
{
    A = 1;
    C = 10000;
    N = 1;
    P = 2000; 
}

几个问题:
1. const变量basef在animal类和Tiger类里面有不同的数值,这样初始化可以么?
2. 不知道如何初始化错误一,arr[i]是指向Animal的一个指针,但是Animal的构造函数必须有一个数值Animal(int),所以该怎么写?
3. TigerArr = new Tiger*[10];

Tiger是Animal的子类,在传递函数的时候,为什么会有错误二

0

4个回答

我来回答你的问题 但不一定能解决你的代码问题
1.Tiger(50)这来初始化一个对象是没有问题的
2.你用的是双重指针正常情况下应该是 arr[i]=new ** ,但这时你的问题来了,new 的默认是 new XX(n) 这可以看出来 你要new必有要有默认构造函数,
就是不带参数的构造函数,带参数的构造函数只能用别的方法 在默认构造里设置一个值或者在类里加个set函数来设置你的const也可以,那样new 之后 直接 调用set(const int n)
3.TigerArr = new Tiger(10); 这里是指创建一个长度为10的tiger数组,用的是默认构造函数,也就是不带参数的构造函数
tiger是Animal的子类 用 tiger*来代替Animal*是完全没问题的,
如楼上说 你用二维指针 确实是有点自己找不痛快,如果 你是新手劝你赶紧换一种方法,这样开始没好处

0
xingjianfengaa
xingjianfengaa 是的 ,设置参数有的是方法,找一种就是,就不影响你的代码 ,不过指针维数多了 那就复杂了,就算工作时,别人看到也会骂人的,写代码尽量越简单越好,否则出错了 检查越来麻烦
10 个月之前 回复
yuAriellexi
yuAriellexi 好的好的,所以new一个对象只可以用默认构造函数,不可以用单参数的那种
10 个月之前 回复
xingjianfengaa
xingjianfengaa 额 1 里面我说的是初始化对象,'对象' 并不是指针或new Tiger
10 个月之前 回复

话说你为啥用二维指针啊,是有点自己找不痛快,还是老师找你们不痛快,一般写代码也没这么写的。
你说抽象类,抽象类里面,也用不着搞二维指针,当然了,你有你的设计方法,我就不多说了,你把你全部代码贴出来,不然我这边也不好判断。

0

还楼上呢,都删了,话说最近我是被针对了吗,老删我回答

0
phenix2009
白色一大坨 代码也不贴全了,就粘贴那么几段,调都没法调,问问题你也得过下脑子
10 个月之前 回复
phenix2009
白色一大坨 好心提醒楼主,说做法不对,还不虚心接受让我配合呢,真怪事了,你做的方法有问题,指出来倒是我有错了不成?
10 个月之前 回复

1、const只是用来修饰basef在当前函数内无法被修改,与类无关,可以初始化;
2、两个方法,一,再写一个无参构造函数,二,给你的构造函数一个形参默认值 Animal::Animal(const int basef = 0);
3、子类与父类、子类指针与父类指针存在默认的向上转型,二维指针不存在,它是指向指针的指针

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
小白求救~~动态数组,指针,继承,面向对象c++
Tiger是Animal的子类rnTigerArr是一个指针指向一组指向Tiger的指针rn```rn Animal **AnimalArr;rn Tiger **TigerArr;rn void f(Animal **arr, int num);//函数原型rn void f(Animal **arr, int num)rnrn for (int i = 0; i < num; i++)rn rn arr[i] = new Animal*(50);//错误一rn//cannot initialize a new value of type 'Animal *' with an rvalue of type 'int'rn rnrncall f:rnf(TigerArr, tigernum);rn错误二:rn cannot initialize a parameter of type 'Animal **' with an lvalue of type 'Tiger **'rn```rnAnimal 构造函数rnrnrn```rn Animal::Animal(const int basef)rn : BaseFoodCost(10)rnrn A = 1;rn C = 0;rn N = 0;rn P = 0;rnrnrn```rnrnrn```rn Tiger::Tiger(const int basef) : Animal(50)rnrn A = 1;rn C = 10000;rn N = 1;rn P = 2000; rnrnrn```rnrn几个问题:rn1. const变量basef在animal类和Tiger类里面有不同的数值,这样初始化可以么?rn2. 不知道如何初始化错误一,arr[i]是指向Animal的一个指针,但是Animal的构造函数必须有一个数值Animal(int),所以该怎么写?rn3. TigerArr = new Tiger*[10];rnrnTiger是Animal的子类,在传递函数的时候,为什么会有错误二
指针与动态数组
C语言中如何实现动态数组: 使用malloc()库函数(内存分配)来得到一个指向一大块内存的指针; 像引用数组一样引用这块内存 如果需要使数组有动态增长的能力,那就修改内存的总容量,直接在运行时在堆上分配数组的内存。这就用到库函数realloc(),它能够对一个现在的内存块大小进行重新分配(通常是实质扩大),同时不会丢失原先内存块的内容。#include <arpa/inet.h> #include
数据结构与算法:动态数组(利用万能指针实现任意类型数组操作)
原理介绍 我们利用万能指针来实现动态数组,数组元素类型可以是任意类型,因为我们只维护用户提供的数据的地址,所以可以用万能指针来接受,这样就实现了类似C++中的模板功能了。 先说说动态数组和静态数组。静态数组一旦建立它的空间是不可变的,比如我们在栈上开辟的空间,一旦开辟,长度就不可变。如果我们用malloc在堆区开辟的数组,如果当我们检测到数组已经满了,我们可以重新开辟一块更大的空间,将原有的数
创建指针动态数组,指针的值
在创建指针动态数组时,如果和普通数组一样创建,也就是数组中指针没有初始化,那么数组中指针是有指向的,就是之前遗留在存储空间中的值。但是可以在语句末尾加()表示初始化,这样会自动帮你把数组中指针的值清空,也就是指针都是空指针。 int **a; a=new int*[20]();//括号的意思是初始化,是的a指向的数组中的指针都是空指针 if (a[0]) cout&amp;lt;&amp;lt;&quot;1\n&quot;; ...
C++析构函数在对象数组,动态指针中使用
一、c++中析构函数的主要作用: 1、完成对象被删除前的的一些清理工作; 2、在对象生存周期结束之后系统会自动调用析构函数,然后释放此对象的空间; 3、如果程序没有声明构造函数,系统会默认自动产生一个隐含的构造函数; 4、析构函数只能有一个,析构函数不能传递任何参数,没有返回类型。 5、使用构造函数和析构函数时,注意先后的使用顺序,注意调用时间和调用顺序,在一般情况下,调用析构函数的次序...
C语言里用结构体和指针函数实现面向对象思想
转自:http://www.linuxidc.com/Linux/2016-12/138789.htm 一、基础研究 观察如下两个程序a.c和b.c: A.c:   B.c:     这两个程序都是要实现在屏幕上第10行40列打印一个绿色的字符c:   这两个程序的数据组织方式是一样的,都是使用结构体,而且对共性和个性的分离的思路也是一样
利用动态数组实现队列
利用动态数组实现队列 队列是一种先进先出的数据结构First in First out(FIFO) 队列的至少应该实现以下接口 package StacksAndQueues.ArrayQueue; /** * @ Description: Queue接口 * @ Date: Created in 20:49 11/07/2018 * @ Author: Anthony_Dua...
C语言 创建动态数组的两种方法
创建动态数组有两种方法 因本人才疏学浅,见识浅薄,有不当之处望指正,谢谢! 声明指针,调用malloc(), 将其返回值赋给指针,使用指针访问数组的元素。而且这个指针可以是静态或者自动的 声明变长数组(VLA),c99新特性。用变量表达式表示数组的维度。 两种方法在功能上相似。比如,两种都可以在运行时确定大小的数组: int a() { int n; int * pi; scanf(&amp;quot;%...
jmu-Java-04面向对象进阶-03-接口-自定义接口ArrayIntegerStack (10 分)
定义IntegerStack接口,用于描述一个存放Integer元素的栈的常见方法: public Integer push(Integer item); //如果item为null,则不入栈直接返回null。如果栈满,也返回null。如果插入成功,返回item。 public Integer pop(); //出栈,如果为空,则返回null。出栈时只移动栈顶指针,相应位置不置为null...
面向对象+对象数组
面向对象+对象数组 1.类是我们Java程序中最小的执行单元:面向对象思想开发(方法) Python:函数 面向对象+函数式编程 类使用class关键字修饰 类名使用首字母大写的写法 一个源文件不能代表一个类,一个源文件中存放多个类 2.什么是对象:能看到的或者说在程序中可以直接使用的内容称为对象 通过new关键字创建的:类名 对象名=new 类名(); 3. 类中的成员变...
7-1 jmu-Java-03面向对象基础-04-形状-继承 (10 分)
前言 前面题目形状中我们看到,为了输出所有形状的周长与面积,需要建立多个数组进行多次循环。这次试验使用继承与多态来改进我们的设计。 本题描述: 定义抽象类Shape属性:不可变静态常量double PI,值为3.14,抽象方法:public double getPerimeter(),public double getArea() Rectangle与Circle类均继承自Shape类。 ...
fortran数组与指针浅谈一
Program vp implicit none integer, target :: x(5) = [1,2,3,4,5] integer, pointer :: p(:) =&amp;gt; null() p =&amp;gt; x !.. 指针指向数组x print*, p(1) p(-1:) =&amp;gt; p !.. 改变下标范围 ...
C语言 字符串数组 二维数组 指针 动态内存分配(2018.11.25)
字符串数组 若字符串数组内内没有‘\0’,用%s输出时,系统会一直找到‘\0’为止。即使超出数组的范围也一直找。 char c[] = “I am happy”; //字符串,长度为11 char c[] = {‘I’, 使用strcat、strcpy,strcmp,strlen,strlur,strupr函数时,需要包含#include&amp;amp;amp;lt;string.h&amp;amp;amp;gt;的头文件 strcat 连接...
C++语言—面向对象之继承详解
类的继承:  我们一直以来接触的函数在一定程度上完成了代码的复用,这里介绍面向对象的重要复用机制—继承 继承机制是面向对象程序设计使代码可以复用的重要手段,他允许我们在保持原有类特性的基础上进行扩展,增加功能。这样产生的类,称为派生类。继承呈现了面向对象程序的层次性,体现了从简单到复杂的认知过程 继承的简单使用: class Person { public: void Display(...
用指针正确的操纵动态数组与正确用delete释放内存的方法
#include #include using namespace std; void f(int *i_ptr,size_t n) { assert(n>0); for(int i=0;in;++i) *(i_ptr++)=i; } int main() { size_t array_siz
c++笔记(4):数组、指针数组、字符串数组、动态存储
c++
C++指针实现动态数组(一维&二维)
动态分配一维数组 1.定义指针: float *p; 2.定义整型变量: int n; 3.输入n: cin&gt;&gt;n; 4.用new在堆区分配内存: p=new float[n]; 5.用指针访问数组元素: p[i]or*(p+i) 6.释放堆内存: delete[]p; 动态分配二维数组 1.定义指针: int **p; 2.定义2个整形变量: int m,n; 3.输入m,n:c...
面向对象的三个基本特征(继承)(extends和implements)
面向对象的三个基本特征是:封装、继承、多态 继承: 百度上解释的方法为: 继承就是当你写一个类时,虽然这个类满足了某些功能但是你又想拓展它的功能,此时你就可以使用继承机制在写一个该类的子类,来完成你需要的功能,一旦子类继承了父类就拥有了父类的方法与域(除私有方法和私有域),在子类中也可以重写父类的方法,覆盖父类中同名的方法,定义与父类相同的域,隐藏父类同名的域,实现子类需要的功能。
C语言面向对象之继承、多态、可变参数、函数指针
最近要交一个小作业:用C语言实现类的封装、继承和多态,就顺手写一写吧。第一次写博客,若有错误之处,还望指教。内容有: 1. 类的定义(私有变量) 2. 类的方法(函数指针,构造/析构函数) 3. 类的继承(基类/派生类) 4. 多态(可变参数)1. 类的定义C++中用class来定义类,C语言可用struct结构体来表示类,使用另一个结构体变量来作为私有成员变量,使用函数指针作为类的
一维动态数组的实现(c语言)
编程输入一个班的某课程的学生成绩,计算其平均分,然后输出。班级人数由键盘输入。#include <stdio.h> #include <stdlib.h> main() { int *p = NULL,i,n,sum; printf("Please enter array numbers: "); scanf("%d",&n); p = (int*)malloc(size
C语言的动态数组 VS C++的动态数组
C语言中的动态数组 C语言中的动态数组就是动态内存分配的知识 首先,先看C语言的那些小秘密之动态数组https://blog.csdn.net/bigloomy/article/details/6615012,里面有关内存分配的内容,请看C语言的那些小秘密之内存分配https://blog.csdn.net/bigloomy/article/details/6581706,如果对其中的real...
C++ 动态数组类模板中,为什么重载了指针转换运算符T *之后,还要重载下标运算符[ ]?
  重置指针转换运算符函数的声明: operator T *(); operator const T *() const;/*后置const是为了让常对象能调用这个成员函数(常对象只能调用常成员函数,不能调用普通成员函数); “const T*”表示,通过对象名创建动态数组后,通过对象名不能改变数组*/   假设动态数组类模板Array,假...
C++多继承,菱形继承,虚继承 ,虚基表和虚基表指针
多继承 当一个子类只有一个直接父类时,称这个继承关系为单继承 当一个子类有两个或两个以上的直接父类时,称这个继承关系为多继承 当存在多继承时,就有可能形成这样一种继承关系 我们称上面的继承关系为菱形继承,来看看菱形继承如何实现   class Person { public:  Person(const string name = &quot;&quot;) :_name(name)   {...
CPP:动态数组vector是如此之简单,array显得不友好
#include #include //适用于任何数组 using namespace std; //array 一旦分配 就无法变长 //vector分配的数组在堆上,适用于任何数据类类型 可以无限嵌套 收缩使用迭代器,动态数据增长 相当于数据结构中的线性表,可以实现线性存储 void main1() { vector myint{ 1, 2, 3, 4, 5, 6 };
JavaScript对象及面向对象基础(对象、构造函数、原型对象、继承、原型链、借用构造函数、组合继承)
JavaScript是一种描述性语言,是一种基于对象和事件驱动的,具有安全性能的脚本语言。 JavaScript语言是通过一种叫做“原型”的方式来实现面向对象编程的。 一、对象 (1)内置对象 String、Date、Array、Boolean、Math、RegExp…这里不做赘述。 (2)自定义对象 方式一:基于Object对象的方式创建对象 &amp;amp;lt;script&amp;amp;gt...
面向对象编程的3种关系:组合,委托和继承
看了侯捷老师一节课的视频,做一个记录和小结,在OOP语言中,面向对象编程,类和类之间有3种关系: 1)Inheritance(继承) 2)Composition(复合) 3)Delegation(委托) 先从Compositon开始讲起,其实在C语言中也见到过,一个结构体里面包含另外一个结构体,在C++中复合也是一样的,侯捷老师以标准库来形象的说明了这种情况,在queue类中包含了dequ
C和指针 (面向小白)
在这里强烈安利一篇文章-------&amp;gt;这是大佬的文章 我这里面要写的基本上就是这篇文章的解释和摘要,可能比较sh,再适合小白吧,另外膜拜大神。 由于输入输出的原因这里采用的是C++的cin 和 cout进行输出 现在我们要通过案例来学习指针看第一个例子: #include&amp;lt;bits/stdc++.h&amp;gt; using namespace std; int main(){ ...
Golang的面向对象编程【结构体、方法、继承、接口】
Golang也支持面向对象编程。但与以前学过传统的面向对象编程语言有区别。 1)Golang没有类class,Go语言的结构体struct和类class有相似的特性。 2)Golang中不存在继承,方法重载,构造函数,析构函数,隐藏和this指针。 3)Golang有继承,封装,多态的特性,但是实现方法与传统OOP语言不同。 1. 结构体struct type 标识符 struct{ …fiel...
JAVA面向对象(继承)
继承 在Java中,类的继承是指在一个现有类的基础上构建一个新的类,构建出来的新类被称作子类,现有的类被称作父类,子类会自动地拥有父类所有可继承的属性和方法。 子类继承自父类,父类派生子类。 class Person { String name; // 声明一个Person类,有成员方法speak()和walk() public void speak() { S...
动态创建二维数组--------二级指针(1)
#include&amp;lt;stdio.h&amp;gt; #include&amp;lt;stdlib.h&amp;gt; #include&amp;lt;string.h&amp;gt; typedef int ElemType; ElemType** Create2DArry(int row,int col) { if (row &amp;lt; 1 || col &amp;lt; 1) return NULL; ElemType **s...
面向对象——继承
一、继承概述:   多个类中存在相同的属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只需要继承那个类即可。 多个类可以称为子类,单独这个类称为父类或者超类,基类等。 子类可以直接访问父类中的非私有的属性和行为。 通过extends关键字让类与类之间产生继承关系。 例如: class B extedns A {  }   二、继承的好处? 1、提...
深入理解原型链和面向对象的继承
说实话关于原型链和面向对象我已经看过很多次了,对看过很多次了,但是依旧不能清晰的表达出他们直接的关系【理解不深】。类似于网上大家说的关于看过一本书,让你说出这本书说了什么了,你吞吞吐吐的回答道:嗯………就是那个那个……嗯…………。好,结束,对说不出来。今天我就自己来分析分析,下次你来问我,我讲给你听啊~~~^_^创建对象的几种方式针对上面贴出来的代码我们说几个概念 构造函数,原型,实例,原型对象,...
一个小白对面向对象的理解
首先,面向对象是一种编程思想,一种把复杂的工作细化、分开来解决。 与面向过程不同的是,面向对象更关注的是把数据和方法封装或者说是模块化,当你用到某一方面的问题的时候可以直接交给这个对象解决,把整个工作模块化,从而组成一个大的项目,自下而上的一种解决方式。而面向过程更注重过程、步骤。 是自上而下的方式。 其次面向对象有继承,多态,封装三大好处,可以让开发者轻而易举的使用各种对象、方法、数据,当...
面向对象三大特性中的继承
在讲面向对象三大特征之一的继承之前,先来讲一个小例子。 我先问一个问题就是:我们经常说水果,那么我说你帮我买个水果,你会知道我想要的是什么吗?答案肯定是不知道了,水果的种类有很多,你怎么知道我是要苹果呢,还是梨呢?那么如果我是跟你说,我想要一个苹果,那么我想你肯定知道我想要的就是水果里面的一种——苹果。 其实上面这个例子和我们面向对象中的继承就是一个道理,水果就相当与继承中的父类,而苹果就相当...
js如何实现继承
在JavaScript中实现继承的方法:1. 原型链(prototype chaining)2. call()/apply()3. 混合方式(prototype和call()/apply()结合)4. 对象冒充继承的方法如下:1、prototype原型链方式:[html] view plain copy function teacher(name){      this.name = name; ...
数据结构实现 1.1:动态数组(C++版)
数据结构实现(一):动态数组(C++版)1. 概念及基本框架2. 基本操作程序实现2.1 增加操作2.2 删除操作2.3 修改操作2.4 查找操作2.5 其他操作3. 算法复杂度分析3.1 增加操作3.2 删除操作3.3 修改操作3.4 查找操作4. 完整代码 1. 概念及基本框架 数组 是一种 线性结构 ,而且存储上属于 顺序存储(即内存的物理空间是连续的),也就是线性表中的 顺序表 。数组结构...
面向对象的继承案例
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt; // 继承:子类不影响父类,子类可以继承父类的一些功能。(代码复用) //属性的继承:调用父类的构造函数.call CreatePerson.call(this,name,sex); //方法的继承:for in 拷贝继承(jq也是) function CreatePerson(name,sex){//父类 ...
浅析js面向对象的继承
以下只列举三种常见方式 1:拷贝继承 首先我们要知道子类究竟要继承父类的哪些特征? 答案是属性和方法。继承父类的属性。我们采用call通过对象冒充的方式。让子类具有父类的属性。那么接下来我们所说的三种方式,都是针对父类的方法。更直接一点,就是父类prototype上的方法。 那么我们就好理解。所谓拷贝继承。就是通过拷贝的方式,把父类prototype上的方法统统赋值给 子类
面向对象概念
前言   最近学自考状态很不佳,没有开始的那种拼劲,总觉得考试时间尚早,殊不知就在眼前,时间真的很快,那我到底学会了什么?真的不知道,不过今天晚上我是懂得了一丢丢的知识,镜哥哥说的很对,有些东西不能只看一本书,或深或浅,多找几本书看看肯定能解决自己的疑惑的。 分享 对象 对象是系统中描述客观事物的一个实体,它是构成系统的一个基本单位,由一组属性和对这组属性进行操作的一组服务组成。 例如:职工、...
C语言的指针数组,多重指针以及main函数的参数
前言 1.本博文基于VC++6.0开发调试运行; 2. 本博文只是对多重指针和指针数组的一个小总结; 指针数组 是什么?是一个数组,是一个元素都是用来存储地址的数组; 定义方式:类型名 *数组名[数组长度] 特点:以往的数组中,一个数组名只能确定一段内存空间,对这段固定内存内的变量的读写修改操作,但是数组指针在一个数组内可以指向若干字符串,这样,可以根据需要用一个指针数组名调用不同字...