IntegerSet in C++
IntegerSet in C++
我在作业中遇到问题。分配是创建一个整数集整数集是一个包含 100 个元素的数组,表示从 0 到 99 的数字例如,如果集合 A 中存在数字 5,则 a[5] = 1
,则空集合是零的数组。
我创建了一个名为 IntegerSet 的类,这里是 integerSet 中的代码.cpp
#include "integerset.h"
#include <iostream>
using std::cout;
using std::endl;
IntegerSet::IntegerSet(){
int temp[100] = {0};
set = temp;
}
IntegerSet::IntegerSet(int * setPtr) {
set = setPtr;
}
void IntegerSet::insertElement(int toInsert) {
if(toInsert < 100 && toInsert >= 0) {
set[toInsert] = 1;
}
}
void IntegerSet::deleteElement(int toDelete) {
if (toDelete < 100 && toDelete >= 0 ) {
set[toDelete] = 0;
}
}
IntegerSet * IntegerSet::unionOfSets(IntegerSet * otherPtr) {
int newSet[100] = {0};
for(int i = 0; i < 100; i++ ) {
if (this->set[i] == 1 || otherPtr->set[i] == 1) {
newSet[i] = 1;
}
}
return new IntegerSet(newSet);
}
IntegerSet * IntegerSet::intersectionOfSets(IntegerSet* otherPtr) {
int newSet[100] = {0};
for(int i = 0; i < 100 ; i++) {
if(this->set[i] == 1 && otherPtr->set[i] == 1){
newSet[i] = 1;
}
}
return new IntegerSet(newSet);
}
bool IntegerSet::isEmpty(){
for(int i = 0 ; i < 100 ; i++) {
if(set[i] == 1) {
return false;
}
}
return true;
}
bool IntegerSet::isEqualTo(IntegerSet * otherPtr) {
for(int i = 0; i < 100 ; i++) {
if(this->set[i] != otherPtr->set[i]) {
return false;
}
}
return true;
}
void IntegerSet::printSet() {
if(isEmpty()) {
cout << "---" << endl;
} else {
for(int i = 0; i < 100 ; i++) {
if(set[i] == 1) {
cout << i << ' ';
}
}
cout << endl;
}
}
IntegerSet::~IntegerSet() {
delete[] set;
}
该类具有私有成员int * set;
。
这是用于测试我的类的主要函数:
#include <iostream>
#include<new>
#include "integerset.h"
using std::cout;
using std::endl;
int main(int argc, char *argv[])
{
IntegerSet * set1Ptr = new IntegerSet();
set1Ptr->insertElement(1);
set1Ptr->insertElement(2);
set1Ptr->insertElement(3);
set1Ptr->insertElement(50);
IntegerSet * set2Ptr = new IntegerSet();
set2Ptr->insertElement(0);
set2Ptr->insertElement(3);
set2Ptr->insertElement(2);
set2Ptr->insertElement(51);
set2Ptr->insertElement(100);
set2Ptr->insertElement(99);
IntegerSet * set3Ptr = set1Ptr->unionOfSets(set2Ptr);
IntegerSet * set4Ptr = set1Ptr->intersectionOfSets(set2Ptr);
cout << "First Set" << endl;
set1Ptr->printSet();
cout << "Second Set" << endl;
set2Ptr->printSet();
cout << "Equal ? : " << set1Ptr->isEqualTo(set2Ptr) << endl;
cout << "Intersection : " << endl;
set4Ptr->printSet();
cout << "Union : " << endl;
set3Ptr->printSet();
system("PAUSE");
return EXIT_SUCCESS;
}
这是我在运行时得到的输出
First Set
16 19 35 45 46 54 66 84
Second Set
0 1 10 12 13 14 19 35 45 46 54 66 84
Equal ? : 1
Intersection :
16 19 35 45 46 54 66 84 98
Union :
0 1 10 12 13 14 19 35 45 46 54 66 84 98
我尝试跟踪,但我不知道出了什么问题,所以非常感谢任何帮助。
IntegerSet::IntegerSet(){
int temp[100] = {0};
set = temp;
}
那就是创建一个包含 100 个元素的本地数组,并在成员set
中存储指向它的指针。这里的问题是temp
的生存期仅限于构造函数,一旦构造函数退出,数组就会被销毁,你所拥有的是一个悬空的指针(指向无效内存块的指针)。
如果需要使用指针,则应动态分配内存,并确保在析构函数中释放它。如果没有,则可以将数组声明为类型的成员属性,并完全避免使用指针。
请记住,对于您调用的每个"新",您必须删除。
IntegerSet::IntegerSet(){
int temp[100] = {0};
set = temp;
}
我认为您的构造函数对您尝试完成的任务没有意义。在析构函数中,包括:
IntegerSet::~IntegerSet() {
delete[] set;
}
如果您首先动态分配了数组,则删除非常有用。如果你想跟上所有这些不重要的指针的东西,你的构造函数应该看起来像这样
IntegerSet::IntegerSet(){
set = new int[100];
for(int i; i < 100; i++)
set[i] = 0;
}
在这种情况下,我根本不会使用指针或动态分配的内存。阵列不需要增长或收缩。在主函数存在之后,它们也不需要存在。尝试在没有所有指针的情况下简化它。
相关文章:
- netcat command in c++
- Difference in displaying cv2 Mat
- C++ MFC Libraries in Travis CI
- 如何在OpenSSL中从configuration.h.in获取configuration.h
- 创建具有 new in 函数和"this is nullptr"异常的对象
- IN, OUT, INOUT Parameters
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 有人安装"IITB Simplecpp in mac"吗?
- 从 C 样式字符串中删除子字符串 "in place" 在C++代码中
- 如何修复"error: ‘_1’ was not declared in this scope"?
- Softmax Implementation in C++
- 将 out/in out 参数与 if/switch 的 init 语句一起使用
- IF-nesting in c++
- Gurobi GRBModel and GRBmodel in C++
- Tensorflow Hub in C++
- Centos7 g++ "to_string is not in a member of std"
- InitializeCriticalSectionEx Not Located In KERNEL32.Dll
- 将 lambda 表达式传递给 std::function in C++
- @CPPFLAGS@在 Makefile.in 中意味着什么?
- std::async from std::async in windows xp