- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我是一名 C++ 学生,这是我在这里发表的第二篇文章。我正在研究一个类,它的工作是维护一个对象指针数组。 (这样可以传入一个指针并将其添加到数组中,而不是整个对象。)该数组应该是动态的,但是当我尝试为其动态分配内存时遇到了一些错误。以下代码在 studArray 处产生错误“expression must be a modifiable lvalue”,如标记的那样。
#ifndef MYCLASS_H
#define MYCLASS_H
#include "Student.h"
class myClass{
private:
Student* studArray[5];
int howMany;
int max;
public:
myClass(){
Student firstOne;
studArray[0] = &firstOne;
howMany=0;
max=5;
}//myClass()
void insertEl( Student* nextEl ){
howMany++;
if(howMany >= max){
Student** tempPt = new Student* [max + 1];
for( int i = 0; i < currentNum; i++){
tempPt[i] = studArray[i];
}
delete [] studArray;
studArray = tempPt; // <-------------------------error
}
studArray[ howMany ] = nextEl;
}//insertEl
};
我尝试将原始 Student * 数组更改为未指定大小,但这在 studArray 处产生了“不允许不完整类型”的错误。
class myClass{
private:
Student* studArray[]; <------------- error
int howMany;
int max;
我做错了什么?(感谢您的帮助!)作为引用,我使用的是 Win 7 64 位、Visual Studio Professional 2012。
最佳答案
假设:教师希望您自己学习内存管理的艺术。所以没有库容器也没有智能指针。有空的时候,看看如何使用标准容器和智能指针。它们会在未来为您节省大量时间和痛苦。
首先,声明学生数组。
Student* studArray[5];
关键就在这里
Student** tempPt = new Student* [max + 1];
那么试试
Student** studArray;
然后破解你的构造函数来分配存储空间
myClass()
{
max = 5;
studArray = new Student*[max]; /* For improved safety, read up on
exceptions, catch and handle the
out of memory exception */
howMany = 0;
} //myClass()
我建议添加一个析构函数来处理清理并放回数组。
virtual ~myClass()
{
delete[] studArray;
}
检查作业笔记或教师,看看谁负责维护学生。在删除 studArray
补充说明:
myClass()
{
Student firstOne;
studArray[0] = &firstOne;
howMany=0;
max=5;
}//myClass()
Student firstOne;
是一个临时变量。 firstOne
仅存在于最近的封闭 {}
大括号之间。这称为作用域。在其范围之外使用任何值都会产生不可预知的结果,并且很可能使程序崩溃。坦率地说,如果你幸运的话。该程序可能会在不确定的时间内运行并在稍后崩溃。
赋值 studArray[0] = &firstOne;
是危险的,因为当任何人尝试使用 studArray[0]
时,它指向的数据将不再是有效的。 firstOne
在构造函数之外不存在。如果你想让 firstOne
继续存在,你必须将它定义为一个指针,用 new
创建它,并在它出现时 delete
不再需要。在这种情况下,我认为您永远不需要它。
另一个建议是将 studArray
的大小加倍,而不是在它已满时简单地添加一个。这样您就不必经常重新分配存储空间并将所有现有学生复制到新存储空间。
关于c++ - 如何实现对象指针的动态数组? "expression must be a modifiable lvalue",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29836542/
这个问题在这里已经有了答案: The "++" and "--" operators have been deprecated Xcode 7.3 (12 个答案) 关闭 5 年前。 我刚刚将我的应
在下面的代码片段中,为什么行 o.margin() = m; 编译没有错误?它很容易得到警告,因为它几乎总是一个错误。我实际上会认为这是一个错误,因为它会将 R 值放在赋值的左侧。 #include
我是 C 语言的新手。我对左值错误有疑问。据我所知,当没有永久地址承载变量来存储右值时,我们会得到一个左值错误。在这里,我可以在左侧看到一个变量。但是,我仍然得到左值错误。有人可以澄清我对左值或所用运
#include int main(){ int i=0,j=1; printf("%d",++(i+j)); return 0; } 在这段代码中,我使用了增量运算符,但我不
#include int main() { int ary[2][3]; foo(ary); } void foo(int (*ary)[3]) { int i = 10,
这个问题已经有答案了: Error: lvalue required in this simple C code? (Ternary with assignment?) (4 个回答) lvalue
我无法理解这段代码为何有效。我进入 C# 世界已经有一段时间了,想在深入研究 C++11 中的新内容(如 RValue Refs 和移动语义)之前先复习一下 C/C++。 我想知道为什么我编写的这段代
我想使用以下我认为不标准的成语。我有利用返回值优化返回 vector 的函数: vector some_func() { ... return vector( /* something
谁能帮我弄清楚为什么我在最内层的循环程序中总是出错 * 突出显示它必须是一个可修改的 lValue。 using namespace std; #include int main() { /
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求提供代码的问题必须表现出对所解决问题的最低限度理解。包括尝试过的解决方案、为什么它们不起作用,以及预
有很多关于模板参数推导的讨论和澄清,特别是引用折叠和“通用引用”。本题通过相关细节:How does auto deduce type? ,而 Scott Meyers 的这篇论文更详细,可能会提供更
在下面的代码中: _imageView.hasHorizontalScroller = YES; _imageView.hasVerticalScroller = YES; _imageView.au
我有以下 C++ 代码,当我编译它时出现“需要左值”错误。请指出我哪里出错了。谢谢。 #include #include void main() { clrscr(); char r[5]
所以 Move 语义很棒,给了我们更高的性能。 我读到这是一个全新的特性,如果没有 C++11,这是“不可能”做到的。 但是我们可以在 C++11 之前做到这一点吗?就像下面这样。 class AAA
根据我的理解,在下面代码中标记为“第 2 行”的行中,表达式 (*ptr)++ 应该生成“需要左值”错误,因为 *ptr 的计算结果为 i=1 的常量值,这不是左值? 那么为什么程序能成功运行呢?还是
多年来,我一直在使用包含以下条件的代码 ref \$_[0] eq 'SCALAR' 我一直希望有一个 ARRAY 或 SCALAR,但最近我将 substr() 传递给了那个参数。意想不到的事情发生
好的,代码是: vector> imageFiltered; // some processing codes here parallel_for( blocked_range(0, imageFil
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
#include main() { int x,n,r; scanf("%d" , & x); for (n=2;n<(x/2);n++) { (x%n=r);
这个问题已经有答案了: Assignment statement used in conditional operators (6 个回答) 已关闭 5 年前。 #include int main()
我是一名优秀的程序员,十分优秀!